2010-03-07 13 views
36

Mam problem z łączeniem moich plików.Błąd łącznika: "plik wejściowy linkera nieużywany, ponieważ połączenie nie zostało wykonane", niezdefiniowane odwołanie do funkcji w tym pliku

Zasadniczo mój program składa się z:

  • programie głównym, gen1.
  • gen1 - otrzymuje wejście wysyła do str2value dla przetwarzania, wyjścia Wynika str2value, przerywa wejście do tokenów użyciu „tokenizera” określa, jaki rodzaj przetwarzania zrobić, aby każdy tokena i przekazuje je do str2num lub str2cmd. Następnie zwraca tablicę wyników o wartości .
  • str2num - ma pewne przetwarzanie
  • str2cmd - Ditto
  • author.py - skrypt Pythona, który generuje str2cmd.c i str2cmd.h z nagłówka cmdTable.h.

Jestem prawie pewna, że ​​moje załączniki są poprawne, sprawdziłem kilka razy. Sprawdziłem również, czy w nagłówkach nie ma żadnych warunków.

Oto mój 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 

Oto wynik I odbieranie z make all:

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 

Wszelkie sugestie o co chodzi? STR2VALUESFILES ma wszystkie pliki obiektów, których potrzebuję, aby zdefiniować brakujące funkcje.

Odpowiedz

42

Myślę, że jesteś zdezorientowany tym, jak kompilator łączy rzeczy. Gdy używasz flagi -c, tzn. Nie jest wykonywane łączenie, dane wejściowe to kod C++, a wynikiem jest kod obiektowy. Pliki .o nie mieszają się zatem z -c, a kompilator ostrzega o tym. Symbole z pliku obiektowego są nie przeniesione do innych plików obiektów, takich jak to.

Wszystkie pliki obiektów powinny znajdować się na ostatnim wywołaniu łącznika, co nie ma miejsca w tym przypadku, więc linker (wywoływany przez front-end g++) narzeka na brakujące symbole.

Oto mały przykład (wywołanie g++ wyraźnie dla jasności):

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) 

Jest też makedepend narzędzie, które pochodzi z X11 - pomaga wiele z zależnościami kodu źródłowego. Możesz również spojrzeć na opcję -Mgcc do budowania reguł make.

+0

Jak mogę zbudować plik obiektowy z innych plików obiektów, a następnie? gen1 nie ma bezpośrednich zależności z str2num str2cmd lub tokenizerem –

+0

Kompilujesz każdy plik '.cpp', a następnie łączysz wszystkie powstałe pliki' .o'. Dodałem prosty przykład "make". –

+0

Nie pamiętam - zarządzaj zależnościami za pośrednictwem plików nagłówkowych, a nie obiektowych. –

Powiązane problemy