के अपरिभाषित संदर्भ में मुझे त्रुटियों के बिना काम करने के लिए अपना मेकफ़ाइल प्राप्त करने में समस्या हो रही है। मेरे पास पहला मुद्दा मुख्य के अनिर्धारित संदर्भ के साथ है। मेरे पास एक निर्माता के रूप में मेरे 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
कोड ** ** ** लंबा है। अपनी समस्या को संक्षिप्त करें और एक [लघु, स्वयं युक्त, सही (संकलित), उदाहरण] (http://sscce.org/) प्रदान करें। –
कुछ सुझाव: 'मुख्य' नुस्खा में, आप लिख सकते हैं: '$ (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
कुछ अन्य सुझाव: आवेदक बनाने के लिए कमांड लाइन ध्वज रखने के लिए केवल 'मेक' के बजाय '$ (मेक)' का उपयोग करें। बेकार आउटपुट की जोड़े लाइनों को रोकने के लिए आप '--no-print-directory' भी देना चाहेंगे। इसके अलावा, सी के लिए 'CFLAGS' का उपयोग करें ('CCFLAGS' के बजाय जिसे C++ के लिए गलत किया जा सकता है)। – Shahbaz