2012-06-27 11 views
8

के लिए अनिर्धारित संदर्भ मैं बनाकर कोड के अपने टुकड़े को संकलित करने की कोशिश कर रहा हूं। आम तौर पर मैं इस तरह मेरी कोड संकलन:मेकफ़ाइल त्रुटि: मुख्य

/opt/timesys/linux-gnu/toolchain/bin/../../toolchain/lib/crt1.o: In function `__start': 
(.text+0xc): undefined reference to `main' 
/opt/timesys/linux-gnu/toolchain/bin/../../toolchain/lib/crt1.o: In function `__start': 
(.text+0x10): undefined reference to `main' 
collect2: ld returned 1 exit status 
make: *** [db.o] Error 1 

कर सकते हैं:

CC= mipsisa32r2el-timesys-linux-gnu-g++ 

export LD_LIBRARY_PATH=:/parsecpp/sqlite-mips2/lib:/parsecpp/lib:/tmp/vixs_temp/DirectFB/single_core/lib 


CFLAGS=-I/usr/include/libxml2 -I/develop/xc4/rootfs/parsecpp/sqlite-mips2/include 

LDFLAGS=-L/develop/xc4/rootfs/parsecpp/lib -L/develop/xc4/rootfs/parsecpp/sqlite-mips2/lib 

LIBS = -lsqlite3 -lxml2 

PROG=testing 

all: main.o db.o mod.o multiplex.o network.o networkinterfacemodule.o program.o service.o 
    $(CC) -o $(PROG) $(CFLAGS) $(LDFLAGS) main.o db.o mod.o multiplex.o network.o networkinterfacemodule.o program.o service.o $(LIBS) 

main.o: main.cpp 
    $(CC) $(CFLAGS) $(LDFLAGS) main.cpp db.cpp networkinterfacemodule.cpp mod.cpp multiplex.cpp network.cpp program.cpp service.cpp $(LIBS) 

db.o: db.cpp 
    $(CC) $(CFLAGS) $(LDFLAGS) db.cpp $(LIBS) 


mod.o: mod.cpp 
    $(CC) $(CFLAGS) $(LDFLAGS) mod.cpp $(LIBS) 

multiplex.o: multiplex.cpp 
    $(CC) $(CFLAGS) $(LDFLAGS) multiplex.cpp $(LIBS) 

network.o: network.cpp 
    $(CC) $(CFLAGS) $(LDFLAGS) network.cpp $(LIBS) 

networkmoduleinterface.o: networkinterfacemodule.cpp 
    $(CC) $(CFLAGS) $(LDFLAGS) networkinterfacemodule.cpp $(LIBS) 

program.o: program.cpp 
    $(CC) $(CFLAGS) $(LDFLAGS) program.cpp $(LIBS) 

service.o: service.cpp 
    $(CC) $(CFLAGS) $(LDFLAGS) service.cpp $(LIBS) 

clean: 
    rm -rf *o testing 

तब मैं इस त्रुटि मिलती है:

mipsisa32r2el-timesys-linux-gnu-g++ -o testing -I/usr/include/libxml2 -L/develop/xc4/rootfs/parsecpp/lib -L/develop/xc4/rootfs/parsecpp/sqlite-mips2/lib -I/develop/xc4/rootfs/parsecpp/sqlite-mips2/include db.cpp main.cpp networkinterfacemodule.cpp network.cpp multiplex.cpp program.cpp service.cpp -lsqlite3 -lxml2 

इस लंबी आदेश से छुटकारा पाने के लिए मैं एक makefile लिखने का प्रयास किया कोई मेरी मदद करता है?

+0

मुझे पसंद है कि मेकफ़ाइल पूरे आदेश की तुलना में कई गुना लंबा है। –

+2

'आरएम-आरएफ * ओ परीक्षण': क्या आप वाकई" ओ "चरित्र में समाप्त होने वाली सभी फाइलों और निर्देशिकाओं को हटाना चाहते हैं? – sth

+1

@ आर। मार्टिनिन्हो फर्नांडीस, लेकिन इसे संकलन के समय को बचाया जाना चाहिए, कोई बड़ी बात नहीं।हालांकि, यह निश्चित रूप से अधिक जटिल रूप से लिखा जा सकता है। – unkulunkulu

उत्तर

16

जब भी आप एक फ़ाइल संकलित कर रहे हों और इसे लिंक नहीं कर रहे हैं, तो "-c" ध्वज का उपयोग करें।

उदाहरण के लिए: -

db.o: db.cpp 
$(CC) -c $(CFLAGS) $(LDFLAGS) db.cpp $(LIBS) 

इसके अलावा, जबकि संकलन, वहाँ कोई जरूरत नहीं प्रदान करने के लिए "$ (LIBS)" संकलक करने के लिए, केवल उन्हें जब जोड़ने प्रदान करते हैं। न ही आपको लिंकर झंडे की आवश्यकता है क्योंकि "-c" ध्वज का उपयोग करते समय लिंकर को नहीं कहा जाता है।

तो तुम लिख सकता है,

db.o: db.cpp 
$(CC) -c $(CFLAGS) db.cpp 

UPDATED (टिप्पणी के आधार पर): -

जब फ़ाइलों को जोड़ने, लिंकर एक और केवल एक main समारोह की उम्मीद है। उपर्युक्त मामले में, मुख्य कार्य db.cpp में परिभाषित नहीं किया गया है और इसलिए संकलन सफल होता है, लिंकर एक त्रुटि फेंकता है क्योंकि इसे main फ़ंक्शन नहीं मिल रहा है।

+0

यह ठीक है। लेकिन सवाल यह है कि यदि ओपी ऐसा करता है तो लिंक क्यों विफल हो जाएगा? – Nawaz

+1

+1 अतिरिक्त रूप से, आप नियम लिखकर मेकफ़ाइल लिखने की अधिक लागत से बच सकते हैं (या डिफ़ॉल्ट नियमों को काम कर सकते हैं। –

+4

@ नवाज़: यदि आप प्रत्येक अनुवाद इकाई को * लिंक * करने का प्रयास करते हैं तो लिंकर ढूंढने में असफल हो जाएगा 'मुख्य 'फ़ंक्शन, जो केवल अनुवाद इकाइयों में से एक में मौजूद है। –

2

जब आप -सी ध्वज के बिना संकलित करते हैं, तो gcc प्रोग्राम को लिंक करने का प्रयास करता है। चूंकि मुख्य कार्य मुख्यतः मुख्य.c में है और db.c में नहीं है, इसलिए db.c. में मुख्य फ़ंक्शन की खोज करते समय लिंकर विफल रहता है। इसका मतलब है कि आपको संकलक को बताने की जरूरत है कि आप अभी भी आउटपुट चाहते हैं जो अभी तक लिंक नहीं है, लेकिन ऑब्जेक्ट फ़ाइल में अनुवाद किया गया है और यह बिल्कुल ठीक है -सी ध्वज करता है।

यह है कि क्या rajatkhanduja में परिणाम है ने कहा:

db.o: db.cpp 
$(CC) -c $(CFLAGS) db.cpp 
0

मुझे लगता है कि आप इस लिंक नियम याद किया।

testing_OBJECTS = main.o db.o mod.o multiplex.o network.o networkinterfacemodule.o program.o service.o 

testing$(EXEEXT): $(testing_OBJECTS) 
    ld $(testing_OBJECTS) $(LDFLAGS) $(LIBS) 

और इस नियम all लिए पूर्व शर्त होनी चाहिए::

all: testing$(EXEEXT) 

इसके अलावा, आपके के सभी के रूप में "

आप एक पहला नियम बताने के लिए चाहिए कैसे के लिए लिंक बनाने * .o: * .cpp "नियम समान हैं, आप एक नियम निर्दिष्ट कर सकते हैं और make आपके लिए फ़ाइल नामों को प्रतिस्थापित कर सकते हैं। पूछें कि क्या आप इस पर अधिक डेटा चाहते हैं।