2013-12-11 6 views
7

के अपरिभाषित संदर्भ में मुझे त्रुटियों के बिना काम करने के लिए अपना मेकफ़ाइल प्राप्त करने में समस्या हो रही है। मेरे पास पहला मुद्दा मुख्य के अनिर्धारित संदर्भ के साथ है। मेरे पास एक निर्माता के रूप में मेरे producer.c फ़ाइल में मुख्य है। दूसरा मुद्दा SearchCustomer() के लिए एक अनिर्धारित संदर्भ है।(.text + 0x20): 'मुख्य' के अनिर्धारित संदर्भ और फ़ंक्शन

त्रुटि:

bash-4.1$ make 
gcc -Wall -c producer.c shared.h 
gcc -Wall -c consumer.c shared.h 
gcc -Wall -c AddRemove.c shared.h 
gcc -pthread -Wall -o producer.o consumer.o AddRemove.o 
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
AddRemove.o: In function `AddRemove': 
AddRemove.c:(.text+0xb1): undefined reference to `SearchCustomer' 
AddRemove.c:(.text+0x1e9): undefined reference to `SearchCustomer' 
AddRemove.c:(.text+0x351): undefined reference to `SearchCustomer' 
collect2: ld returned 1 exit status 
make: *** [producer] Error 1 

makefile:

COMPILER = gcc 
CCFLAGS = -Wall 
all: main 

debug: 
    make DEBUG=TRUE 


main: producer.o consumer.o AddRemove.o 
    $(COMPILER) -pthread $(CCFLAGS) -o producer.o consumer.o AddRemove.o 
producer.o: producer.c shared.h 
    $(COMPILER) $(CCFLAGS) -c producer.c shared.h 
consumer.o: consumer.c shared.h 
    $(COMPILER) $(CCFLAGS) -c consumer.c shared.h 
AddRemove.o: AddRemove.c shared.h 
    $(COMPILER) $(CCFLAGS) -c AddRemove.c shared.h 


ifeq ($(DEBUG), TRUE) 
    CCFLAGS += -g 
endif 

clean: 
    rm -f *.o 
+0

कोड ** ** ** लंबा है। अपनी समस्या को संक्षिप्त करें और एक [लघु, स्वयं युक्त, सही (संकलित), उदाहरण] (http://sscce.org/) प्रदान करें। –

+0

कुछ सुझाव: 'मुख्य' नुस्खा में, आप लिख सकते हैं: '$ (COMPILER) -o $ @ $^$ (एलडीएफएलजीएस)' और 'एलडीएफएलजीएस' में '-pthread' डालें। अन्य नियमों में आप ** एक बार ** ** '% .o:% .c' और नुस्खा के रूप में लिख सकते हैं:' $ (COMPILER) $ (CCFLAGS) -c -o $ @ $ <'(और ** नहीं * * कंपाइलर को '.h' दें!) और बाद में विशेष लक्ष्यों के लिए निर्भरता जोड़ें, उदाहरण के लिए: 'producer.o: shared.h other_header.h' और' consumer.o: shared.h yet_another_header.h' आदि – Shahbaz

+1

कुछ अन्य सुझाव: आवेदक बनाने के लिए कमांड लाइन ध्वज रखने के लिए केवल 'मेक' के बजाय '$ (मेक)' का उपयोग करें। बेकार आउटपुट की जोड़े लाइनों को रोकने के लिए आप '--no-print-directory' भी देना चाहेंगे। इसके अलावा, सी के लिए 'CFLAGS' का उपयोग करें ('CCFLAGS' के बजाय जिसे C++ के लिए गलत किया जा सकता है)। – Shahbaz

उत्तर

10

यह नियम

main: producer.o consumer.o AddRemove.o 
    $(COMPILER) -pthread $(CCFLAGS) -o producer.o consumer.o AddRemove.o 

गलत है। यह producer.o नाम की एक फाइल बनाने के लिए कहता है, लेकिन आप main नाम की एक फ़ाइल बनाना चाहते हैं। चिल्ला बहाना कृपया, लेकिन हमेशा $ @ का उपयोग करके लक्षित संदर्भ के लिए:

+4

इसके सभी निर्भरताओं को संदर्भित करने के लिए '$ ^' का भी उपयोग करें। – Shahbaz

4

इस त्रुटि का अर्थ है कि, जबकि जोड़ने, संकलक कहीं भी main() समारोह की परिभाषा को खोजने के लिए सक्षम नहीं है।

आपके मेकफ़ाइल में, main नियम इस तरह कुछ विस्तारित होगा।

main: producer.o consumer.o AddRemove.o 
    gcc -pthread -Wall -o producer.o consumer.o AddRemove.o 

gccmanual page के अनुसार, -o स्विच के उपयोग

-o file Place output in file file. This applies regardless to whatever sort of output is being produced, whether it be an executable file, an object file, an assembler file or preprocessed C code. If -o is not specified, the default is to put an executable file in a.out.

नीचे के रूप में इसका मतलब है, जीसीसी तत्काल -o स्विच करने के लिए अगले प्रदान की फ़ाइल नाम में उत्पादन में डाल दिया जाएगा। तो, यहां सभी .o फ़ाइलों को एक साथ जोड़ने और बाइनरी [main) को अपने मामले में जोड़ने के बजाय, producer.o के रूप में बाइनरी को क्रेट करना, अन्य .o फ़ाइलों को लिंक करना। कृपया इसे सही करें।

संबंधित मुद्दे