J'ai des problèmes avec la liaison de mes fichiers.
Fondamentalement, mon programme comprend:
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 traitementstr2cmd
- idemauthor.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.
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 -M
gcc
option pour construire des règles make
.