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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top