Linker-Fehler: „Linker-Eingabedatei wird nicht verwendet, da die Verknüpfung nicht erfolgt ist“, undefinierter Verweis auf eine Funktion in dieser Datei

Lesezeit: 5 Minuten

Umrahmt den Benutzeravatar von Catherine White
Rahmen Catherine White

Ich habe Probleme mit der Verknüpfung meiner Dateien.

Grundsätzlich besteht mein Programm aus:

  • Das Hauptprogramm, gen1.
  • gen1 – empfängt Eingang sendet an str2value zur Verarbeitung, gibt Ergebnisse aus str2valuezerlegt Eingaben in Tokens unter Verwendung von “Tokenizer”, bestimmt, welche Art von Verarbeitung mit jedem Token durchgeführt werden soll, und übergibt sie an str2numoder str2cmd. Es gibt dann ein Array der Ergebnisse zurück.
  • str2num – führt eine Verarbeitung durch
  • str2cmd – dito
  • author.py – ein Python-Skript, das generiert str2cmd.c und str2cmd.h aus einer Überschrift cmdTable.h.

Ich bin mir ziemlich sicher, dass ich meine Includes richtig habe, ich habe ein paar Mal nachgesehen. Ich habe auch überprüft, dass es keine Bedingungen gibt #ifndef falsch in den Überschriften.

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.

Benutzeravatar von Nikolai Fetissov
Nikolai Fetissov

Ich denke, Sie sind verwirrt darüber, wie der Compiler die Dinge zusammenfügt. Wenn Sie verwenden -c -Flag, dh es findet keine Verknüpfung statt, die Eingabe ist C++-Code und die Ausgabe ist Objektcode. Das .o Dateien vermischen sich also nicht mit -c, und der Compiler warnt Sie davor. Symbole aus der Objektdatei sind nicht so in andere Objektdateien verschoben.

Alle Objektdateien sollten sich beim letzten Linker-Aufruf befinden, was hier nicht der Fall ist, also linker (aufgerufen via g++ Frontend) beschwert sich über fehlende Symbole.

Hier ein kleines Beispiel (calling g++ ausdrücklich zur Verdeutlichung):

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)

Es gibt auch makedepend Dienstprogramm, das mit X11 geliefert wird – hilft sehr bei Quellcode-Abhängigkeiten. Vielleicht möchten Sie sich auch die ansehen -M gcc Möglichkeit zum Bauen make Regeln.

  • Wie kann ich dann eine Objektdatei aus anderen Objektdateien erstellen? gen1 hat keine direkten Abhängigkeiten mit str2num, str2cmd oder Tokenizer

    – Frames Catherine White

    7. März 2010 um 4:39 Uhr

  • Sie kompilieren jeweils .cpp Datei einzeln, dann alle resultierenden verknüpfen .o Dateien zusammen. Ich habe eine einfache hinzugefügt make Beispiel.

    – Nikolai Fetissov

    7. März 2010 um 4:44 Uhr

  • Vergessen zu erwähnen – Verwalten Sie Abhängigkeiten über Header-Dateien, nicht über Objektdateien.

    – Nikolai Fetissov

    7. März 2010 um 4:45 Uhr

  • Ich habe Probleme, Ihrem Beispiel zu folgen. Ich habe noch nie gesehen, dass $@, @< oder Sie .cpp.o verwenden

    – Frames Catherine White

    7. März 2010 um 5:06 Uhr

  • .cpp.o Regel sagt make wie man eine Datei mit erstellt .o Suffix aus der entsprechenden Datei mit .cpp Suffix (sagen wir, wie man produziert main.o aus main.cpp) Das $< ist die “Eingabe” der Regel, $@ ist die “Ausgabe” (wieder, $< wäre main.cpp, $@ wäre main.o) Diese sind eingebaute Variablen von make.

    – Nikolai Fetissov

    7. März 2010 um 5:14 Uhr

1411780cookie-checkLinker-Fehler: „Linker-Eingabedatei wird nicht verwendet, da die Verknüpfung nicht erfolgt ist“, undefinierter Verweis auf eine Funktion in dieser Datei

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy