wake-up-neo.com

Linker-Fehler: "Linker-Eingabedatei nicht verwendet, da Verknüpfung nicht ausgeführt", undefinierter Verweis auf eine Funktion in dieser Datei

Ich habe Probleme mit der Verknüpfung meiner Dateien.

Grundsätzlich besteht mein Programm aus:

  • Das Hauptprogramm, gen1.
  • gen1 - Empfängt Eingabesendungen zur Verarbeitung an str2value, Gibt Ergebnisse aus str2value, Unterbricht die Eingabe in Tokens unter Verwendung von "Tokenizer" und übergibt die Art der Verarbeitung für jeden Token Sie gehen zu str2num oder str2cmd. Anschließend wird ein Array der Ergebnisse zurückgegeben.
  • str2num - führt eine Verarbeitung durch
  • str2cmd - ebenso
  • author.py - Ein python= Skript, das str2cmd.c Und str2cmd.h Aus einem Header cmdTable.h Generiert.

Ich bin mir ziemlich sicher, dass ich meine Includes richtig eingestellt habe. Ich habe ein paar Mal nachgesehen. Ich habe auch überprüft, ob die Überschriften keine falschen Bedingungen #ifndef Enthalten.

Hier ist mein 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

Hier ist die Ausgabe, die ich von make all erhalte:

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

Irgendwelche Vorschläge, worum es geht? STR2VALUESFILES Hat alle Objektdateien, die ich brauche, um die fehlenden Funktionen zu definieren.

38
Lyndon White

Ich denke, Sie sind verwirrt darüber, wie der Compiler die Dinge zusammensetzt. Wenn Sie das Flag -c Verwenden, d. H. Keine Verknüpfung erfolgt, ist die Eingabe C++ - Code und die Ausgabe ist Objektcode. Die .o - Dateien mischen sich also nicht mit -c, Und der Compiler warnt Sie davor. Symbole aus Objektdateien werden nicht in andere Objektdateien verschoben.

Alle Objektdateien sollten sich beim letzten Aufruf des Linkers befinden, was hier nicht der Fall ist. Daher beschwert sich der Linker (der über das Front-End g++ Aufgerufen wird) über fehlende Symbole.

Hier ist ein kleines Beispiel (aus Gründen der Übersichtlichkeit wird g++ Explizit aufgerufen):

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)

Es gibt auch das Hilfsprogramm makedepend , das mit X11 geliefert wird - es hilft sehr bei Quellcode-Abhängigkeiten. Sie können sich auch die Option -Mgcc ansehen, um make Regeln zu erstellen.

50