web-dev-qa-db-fra.com

Erreur de l'éditeur de liens: "fichier d'entrée de l'éditeur de liens inutilisé car la liaison n'a pas été effectuée", référence non définie à une fonction de ce fichier

J'ai des problèmes avec la liaison de mes fichiers.

Fondamentalement, mon programme comprend:

  • Le programme principal, gen1.
  • gen1 - reçoit l'entrée envoie à str2value pour le traitement, affiche les résultats str2value, divise les entrées en jetons à l'aide de "tokenizer" détermine le type de traitement à effectuer pour chaque jeton et les transmet à str2num, ou str2cmd. Il renvoie ensuite un tableau des résultats.
  • str2num - fait un peu de traitement
  • str2cmd - idem
  • author.py - un python qui génère str2cmd.c et str2cmd.h à partir d'un en-tête cmdTable.h.

Je suis à peu près sûr que j'ai bien mes inclus, j'ai vérifié plusieurs fois. J'ai également vérifié qu'il n'y a pas de conditions #ifndef mal dans les en-têtes.

Voici mon 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

Voici la sortie que je reçois de 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

Des suggestions sur ce dont il s'agit? STR2VALUESFILES possède tous les fichiers objets dont j'ai besoin pour définir les fonctions manquantes.

38
Lyndon White

Je pense que vous ne savez pas comment le compilateur met les choses ensemble. Lorsque vous utilisez -c flag, c'est-à-dire qu'aucune liaison n'est effectuée, l'entrée est du code C++ et la sortie est du code objet. Le .o les fichiers ne se mélangent donc pas avec -c, et le compilateur vous en avertit. Les symboles du fichier objet ne sont pas déplacés vers d'autres fichiers objet comme celui-ci.

Tous les fichiers objets doivent être sur l'invocation finale de l'éditeur de liens, ce qui n'est pas le cas ici, donc l'éditeur de liens (appelé via g++ front-end) se plaint des symboles manquants.

Voici un petit exemple (appelant g++ explicitement pour plus de clarté):

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

all: $(PROG)

.cpp.o:
        g++ -Wall -pedantic -ggdb -O2 -c -o $@ $<

$(PROG): $(OBJS)
        g++ -Wall -pedantic -ggdb -O2 -o $@ $(OBJS)

Il y a aussi makedepend utilitaire fourni avec X11 - aide beaucoup avec les dépendances du code source. Vous pouvez également consulter le -Mgcc option pour construire des règles make.

50
Nikolai Fetissov