2010-03-07 6 views
36

मुझे अपनी फ़ाइलों को जोड़ने में समस्या हो रही है।लिंकर त्रुटि: "लिंकर इनपुट फ़ाइल अप्रयुक्त है क्योंकि लिंक नहीं किया गया है", उस फ़ाइल में किसी फ़ंक्शन के अपरिभाषित संदर्भ

  • मुख्य कार्यक्रम, gen1:

    मूल रूप से, मेरे कार्यक्रम के होते हैं।

  • gen1 - इनपुट प्रसंस्करण के लिए str2value के लिए भेजता है प्राप्त करता है, आउटपुट परिणाम str2value, टोकन में इनपुट टूट जाता है "tokenizer" का उपयोग निर्धारित करता है प्रसंस्करण के प्रकार प्रत्येक टोकन के लिए क्या करना है, और उन्हें str2num, या str2cmd के लिए रवाना होकर गुजरता है। इसके बाद परिणाम के सरणी लौटाती है।
  • str2num - डिट्टो
  • author.py - - एक अजगर स्क्रिप्ट है कि एक शीर्ष लेख cmdTable.h से str2cmd.c और str2cmd.h उत्पन्न करता है कुछ प्रसंस्करण
  • str2cmd करता है।

मुझे पूरा यकीन है कि मेरे पास सही शामिल है, मैंने दो बार जांच की है। मैंने यह भी जांच की है कि हेडर में #ifndef कोई समस्या नहीं है।

यहाँ मेरी Makefile है:

#CPP = g++ -lserial 
CPP = g++ -DTESTMODE 
C= gcc 
DEFINES = LURC 
CFLAGS = -Wall -fshort-enums -D$(DEFINES) 
PROJECTFILES = gen1.cpp str2value.o 

STR2VALUEFILES = str2value.cpp str2cmd.o str2num.o tokenizer.o str2value.h 

gen1 : $(PROJECTFILES) 
     $(CPP) $(CFLAGS) -o gen1 $(PROJECTFILES) 



str2value.o : $(STR2VALUEFILES) 
#  echo "str2value" 
     $(CPP) $(CFLAGS) -c $(STR2VALUEFILES) 

str2num.o: str2num.cpp str2value.h str2num.hpp 
     $(C) $(CFLAGS) -c $^ 


tokenizer.o: tokenizer.cpp tokenizer.hpp 
     $(CPP) $(CFLAGS) -c $^ 

str2cmd.o : authorCMDs.py cmdTable.h 
     python authorCMDs.py cmdTable.h str2cmd #this uses the gcc -E cmdTable.h -DLURC 
     $(C) $(CFLAGS) -c str2cmd.c str2cmd.h 

#TODO: add a thing that checks str2cmd.h/.c has not been modified by hand 



.PHONEY: clean 
clean: 
     rm *.o 

.PHONEY: all 
all: 
     clear 
     make clean 
     make 

यहाँ है उत्पादन मैं मेकअप से प्राप्त सभी:

make clean 
make[1]: Entering directory `/home/frames/LURC/gen1/gen1Source' 
rm *.o 
make[1]: Leaving directory `/home/frames/LURC/gen1/gen1Source' 
make 
make[1]: Entering directory `/home/frames/LURC/gen1/gen1Source' 
python authorCMDs.py cmdTable.h str2cmd #this uses the gcc -E cmdTable.h -DLURC 
str2cmd.c and str2cmd.h, generated from cmdTable.h 

gcc -Wall -fshort-enums -DLURC -c str2cmd.c str2cmd.h 
gcc -Wall -fshort-enums -DLURC -c str2num.cpp str2value.h str2num.hpp 
g++ -DTESTMODE -Wall -fshort-enums -DLURC -c tokenizer.cpp tokenizer.hpp 
g++ -DTESTMODE -Wall -fshort-enums -DLURC -c str2value.cpp str2cmd.o str2num.o tokenizer.o str2value.h 
g++: str2cmd.o: linker input file unused because linking not done 
g++: str2num.o: linker input file unused because linking not done 
g++: tokenizer.o: linker input file unused because linking not done 
g++ -DTESTMODE -Wall -fshort-enums -DLURC -o gen1 gen1.cpp str2value.o 
str2value.o: In function `getValue(char*)': 
str2value.cpp:(.text+0xbd): undefined reference to `str2cmd(char*)' 
str2value.cpp:(.text+0x102): undefined reference to `str2num(char*)' 
str2value.o: In function `getAllValues(char*)': 
str2value.cpp:(.text+0x164): undefined reference to `tokenizer::tokenizer(char*)' 
str2value.cpp:(.text+0x177): undefined reference to `tokenizer::getNumTokens(char const*)' 
str2value.cpp:(.text+0x1a9): undefined reference to `tokenizer::getNextToken(char const*)' 
str2value.cpp:(.text+0x1e9): undefined reference to `tokenizer::getNumTokens(char const*)' 
str2value.cpp:(.text+0x201): undefined reference to `tokenizer::~tokenizer()' 
str2value.cpp:(.text+0x25b): undefined reference to `tokenizer::~tokenizer()' 
collect2: ld returned 1 exit status 
make[1]: *** [gen1] Error 1 
make[1]: Leaving directory `/home/frames/LURC/gen1/gen1Source' 
make: *** [all] Error 2 

क्या इस बारे में है के बारे में कोई सुझाव? STR2VALUESFILES में लापता कार्यों को परिभाषित करने के लिए मुझे आवश्यक सभी ऑब्जेक्ट फ़ाइलें हैं।

उत्तर

42

मुझे लगता है कि आप इस बारे में उलझन में हैं कि कंपाइलर चीजों को एक साथ कैसे रखता है। जब आप -c ध्वज का उपयोग करते हैं, यानी कोई लिंकिंग नहीं की जाती है, तो इनपुट सी ++ कोड होता है, और आउटपुट ऑब्जेक्ट कोड होता है। .o फाइलें इस प्रकार -c के साथ मिश्रित नहीं होती हैं, और संकलक आपको इसके बारे में चेतावनी देता है। ऑब्जेक्ट फ़ाइल से प्रतीकों नहीं इस तरह की अन्य ऑब्जेक्ट फ़ाइलों में स्थानांतरित हो गए हैं।

सभी ऑब्जेक्ट फ़ाइलें अंतिम लिंकर आमंत्रण पर होनी चाहिए, जो यहां नहीं है, इसलिए लिंकर (g++ फ्रंट एंड के माध्यम से बुलाया गया) लापता प्रतीकों के बारे में शिकायत करता है।

यहाँ एक छोटा सा उदाहरण है (स्पष्टता के लिए स्पष्ट रूप से g++ बुला):

PROG ?= myprog 
OBJS = worker.o main.o 

all: $(PROG) 

.cpp.o: 
     g++ -Wall -pedantic -ggdb -O2 -c -o [email protected] $< 

$(PROG): $(OBJS) 
     g++ -Wall -pedantic -ggdb -O2 -o [email protected] $(OBJS) 

वहाँ भी makedepend उपयोगिता है कि X11 के साथ आता है है - स्रोत कोड निर्भरता के साथ एक बहुत मदद करता है। आप make नियमों के निर्माण के लिए -Mgcc विकल्प भी देखना चाहेंगे।

+0

मैं अन्य ऑब्जेक्ट फ़ाइलों में से किसी ऑब्जेक्ट फ़ाइल को कैसे बना सकता हूं? gen1 में str2num str2cmd या टोकनेज़र –

+0

के साथ कोई प्रत्यक्ष निर्भरता नहीं है, आप प्रत्येक '.cpp' फ़ाइल को व्यक्तिगत रूप से संकलित करते हैं, फिर सभी परिणामी '.o' फ़ाइलों को एकसाथ लिंक करते हैं। मैंने एक सरल 'मेक' उदाहरण जोड़ा। –

+0

उल्लेख करने के लिए भूल गए - हेडर फ़ाइलों के माध्यम से निर्भरताओं का प्रबंधन, फ़ाइलों को ऑब्जेक्ट नहीं। –

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