Linker-fout: “linker-invoerbestand niet gebruikt omdat koppelen niet voltooid”, niet-gedefinieerde verwijzing naar een functie in dat bestand

Ik heb problemen met het koppelen van mijn bestanden.

In principe bestaat mijn programma uit:

  • Het hoofdprogramma, gen1.
  • gen1– ontvangt invoer en stuurt naar str2valuevoor
    verwerking, output resultaten str2value, breekt invoer in tokens
    het gebruik van “tokenizer” bepaalt wat voor soort verwerking met elk moet worden gedaan
    token, en geeft ze door aan str2num, of str2cmd. Het keert dan terug een
    reeks van de resultaten.
  • str2num– doet wat verwerking
  • str2cmd– idem
  • author.py– een python-script dat str2cmd.cen str2cmd.hgenereert uit een header cmdTable.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 #ifndefverkeerd 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? STR2VALUESFILESheeft 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 -cgebruikt, d.w.z. er wordt niet gelinkt, is de invoer C++-code en is de uitvoer objectcode. De .obestanden 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 -Mgccoptie voor het bouwen van makeregels.

Other episodes