Undefinierte Symbole Fehler bei Verwendung einer Header -Datei
-
24-10-2019 - |
Frage
Ich bekomme den folgenden Fehler und kann für mein Leben nicht herausfinden, was ich falsch mache.
$ gcc main.c -o main
Undefined symbols:
"_wtf", referenced from:
_main in ccu2Qr2V.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
Haupt c:
#include <stdio.h>
#include "wtf.h"
main(){
wtf();
}
wtf.h:
void wtf();
wtf.c:
void wtf(){
printf("I never see the light of day.");
}
Wenn ich nun die gesamte Funktion in die Header -Datei anstelle der Signatur einbeziehe, ist sie in Ordnung, sodass ich weiß, dass WTF.H enthalten ist. Warum sieht der Compiler wtf.c nicht? Oder vermisst ich etwas?
Grüße.
Lösung
Sie müssen verlinken wtf
mit Ihrer main
. Einfachste Möglichkeit, es zusammen zu kompilieren - gcc
wird sie für Sie wie diese verknüpfen:
gcc main.c wtf.c -o main
Längerer Weg (separate Zusammenstellung von wtf
):
gcc -c wtf.c
gcc main.c wtf.o -o main
Noch länger (separate Zusammenstellung und Verknüpfung)
gcc -c wtf.c
gcc -c main.c
gcc main.o wtf.o -o main
Statt zuletzt gcc
Rufen Sie an, Sie können ausführen ld
direkt mit dem gleichen Effekt.
Andere Tipps
Sie verpassen die Tatsache, dass lediglich ein Kopfball dem Compiler nichts über die tatsächliche Implementierung (die Definitionen) der Dinge sagt erklärt im Kopf sind.
Sie könnten sich in einer C-Datei neben der Einschließung befinden, sie könnten aus einer vorgefertigten statischen Linkbibliothek oder einer dynamischen Bibliothek stammen, die vom System-Linker beim Lesen Ihrer ausführbaren Datei geladen wird, oder sie könnten zum Laufzeitnutzer kommen Programmierer kontrollierte explizite dynamische Belastung (die DLOPEN ()
Funktionsfamilie unter Linux zum Beispiel).
C ist nicht wie Java, es gibt keine implizite Regel, dass der Compiler, nur weil eine C -Datei einen bestimmten Header enthält, auch etwas tun sollte, um die Implementierung der im Header deklarierten Dinge zu finden. Sie müssen es sagen.