2010-03-07 10 views
36

Ho problemi con il collegamento dei miei file.Errore linker: "file di input del linker non utilizzato perché il collegamento non è stato eseguito", riferimento non definito a una funzione in quel file

In sostanza, il mio programma si compone di:

  • Il programma principale, gen1.
  • gen1 - riceve in ingresso invia al str2value per elaborazione, uscite risultati str2value, rotture dei sensori in token usando "tokenizer" determina quale tipo di lavorazione da fare per ogni token e li passa fuori a str2num, o str2cmd. Quindi restituisce una matrice dei risultati.
  • str2num - fa alcune elaborazioni
  • str2cmd - idem
  • author.py - uno script python che genera str2cmd.c e str2cmd.h da un colpo di testa cmdTable.h.

Sono quasi sicuro di avere i miei diritti, ho controllato un paio di volte. Ho anche verificato che non ci sono condizioni #ifndef sbagliate nelle intestazioni.

Ecco il mio 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 

Ecco l'output ricevo da make tutti:

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 

Tutti i suggerimenti su che cosa si tratta? STR2VALUESFILES ha tutti i file oggetto di cui ho bisogno, per definire le funzioni mancanti.

risposta

42

Penso che tu sia confuso su come il compilatore mette insieme le cose. Quando si utilizza il flag -c, ovvero non viene eseguito alcun collegamento, l'input è codice C++ e l'output è codice oggetto. I file .o non si combinano quindi con -c e il compilatore ti avverte in merito. I simboli dal file oggetto sono non spostati in altri file oggetto del genere.

Tutti i file oggetto devono trovarsi nell'invocazione finale del linker, che non è il caso qui, quindi il linker (chiamato tramite g++ front-end) si lamenta dei simboli mancanti.

Ecco un piccolo esempio (chiamando g++ esplicitamente per chiarezza):

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) 

C'è anche makedepend programma di utilità che viene fornito con X11 - aiuta molto con dipendenze di codice sorgente. Si potrebbe anche voler vedere l'opzione -Mgcc per la costruzione delle regole make.

+0

come posso creare un file oggetto, da altri file oggetto, quindi? gen1 non ha dipendenze dirette con str2num str2cmd o tokenizer –

+0

Si compila individualmente ogni file '.cpp', quindi si collegano tutti i file' .o' risultanti. Ho aggiunto un semplice esempio di 'make'. –

+0

Hai dimenticato di menzionare: gestisci le dipendenze tramite i file di intestazione, non i file oggetto. –

Problemi correlati