Ik heb problemen met het koppelen van mijn bestanden.
In principe bestaat mijn programma uit:
- Het hoofdprogramma,
gen1
. gen1
– ontvangt invoer en stuurt naarstr2value
voor
verwerking, output resultatenstr2value
, breekt invoer in tokens
het gebruik van “tokenizer” bepaalt wat voor soort verwerking met elk moet worden gedaan
token, en geeft ze door aanstr2num
, ofstr2cmd
. Het keert dan terug een
reeks van de resultaten.str2num
– doet wat verwerkingstr2cmd
– idemauthor.py
– een python-script datstr2cmd.c
enstr2cmd.h
genereert uit een headercmdTable.h
.
Ik ben er vrij zeker van dat ik het goed heb, ik heb het een paar keer gecontroleerd. Ik heb ook gecontroleerd of er geen voorwaarden #ifndef
verkeerd zijn in de headers.
Hier is mijn 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
Dit is de output die ik ontvang van 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
Enige suggesties over waar dit over gaat? STR2VALUESFILES
heeft alle objectbestanden die ik nodig heb om de ontbrekende functies te definiëren.
Antwoord 1, autoriteit 100%
Ik denk dat je in de war bent over hoe de compiler dingen in elkaar zet. Wanneer u de vlag -c
gebruikt, d.w.z. er wordt niet gelinkt, is de invoer C++-code en is de uitvoer objectcode. De .o
bestanden vermengen zich dus niet met -c
, en de compiler waarschuwt je daarvoor. Symbolen uit objectbestanden worden nietverplaatst naar andere objectbestanden zoals dat.
Alle objectbestanden zouden op de laatste linkeraanroep moeten staan, wat hier niet het geval is, dus linker (aangeroepen via g++
front-end) klaagt over ontbrekende symbolen.
Hier is een klein voorbeeld (voor de duidelijkheid wordt g++
expliciet aangeroepen):
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)
Er is ook een makedepend
-hulpprogramma dat bij X11 wordt geleverd – helpt veel met afhankelijkheden van de broncode. Je zou ook kunnen kijken naar de -M
gcc
optie voor het bouwen van make
regels.