Undefinierte Referenz Können Sie Funktionsfehler In C? Sofort Reparieren
November 13, 2021
Empfohlen: Fortect
Hier sind einige einfache grundlegende Schritte, die Ihnen helfen, einen undefinierten Funktionsfehlerlink in Problem ke zu beheben. g.Dieser Fehler kann sich oft dadurch manifestieren, dass jemand den vollständigen Namen der Funktion oder möglicherweise eine Variable falsch eingegeben hat. Für ist der richtige Code: #include
g.
Wie kompilieren und verbinden? Sie benötigen dies, um die Dateien zu sagen, zum Beispiel:
gcc testpoint.c point.c
… er weiß einfach, dass die Website für beide sehr gut ist. Wenn Sie jedoch handverlesenen Code schreiben, stoßen Sie auf das Zählerproblem: mehrere Definitionen von Foundation
. Sie sollten / wollen nur eine entfernen können (wahrscheinlich eine von allen unter Punkt c).
In jedem Hauptprogramm kompilieren Sie den Link in der Regel separat, um zu verhindern, dass alles, was sich nicht geändert hat, neu kompiliert wird. Normalerweise geben Sie an, was vom Makefile erreicht werden soll und verwenden sogar make
, um dies zu überprüfen. In dieser Situation benötigen Sie möglicherweise Folgendes:
OBJS = Bewertung point.o point.otestpoint.exe: $ (OBJS) gcc $ (OJBS)
Das erste ist nur ein Makro, das sich auf Objektanwendungsnamen bezieht. Es wurde wirklich auf $ (OBJS)
erweitert. Die zweite ist eine Regel, die vorschlägt, 1) die ausführbare Datei auf Objektdateien zu setzen und 2) anzugeben, wie die exe erweitert wird, wenn / wenn sie gestartet wird, um die Fragedatei zu vergleichen.
Die meisten Versionen von make (einschließlich der Version, die in MinGW definitiv ziemlich sicher ist) haben Ihre eigene eingebaute „Standardregel“, die ihnen sagt, wie sie eine Zieldatei erstellen können, die von einem C-Quellimage erhalten wird. Normalerweise sieht es so aus:
like.c.o: $ (CC) -c Bargeld (CFLAGS) $ <
Das Etablieren des C-Compilers wird in seinem Makro als CC gedacht (implizit sogar als CC = gcc
definiert) und ermutigt Sie, viel bereitzustellen, da Flags präsentiert werden müssen Sie auf einem Makro namens Important CFLAGS
(wie CFLAGS = -O3
, um die Optimierung zu aktivieren) und zusätzlich kann $
jedes benutzerdefinierte Makro sein, das in . erweitert wird eine Art Weg, von dem Sie kommen. nennen, wie die Datei des Kreditgebers. Normalerweise
Sie markieren dies in einer Anweisung im Allgemeinen Makefile
, und um Ihr eigenes persönliches eigenes Programm zu erstellen, geben Sie einfach Cause
hier in die Befehlssequenz ein. Es expandiert implizit eine Datei mit der Bezeichnung And makefile
und führt alle darin enthaltenen Regeln aus.
Im Idealfall sucht make
automatisch nach Dateizeitstempeln, um die zuletzt verbesserten Dateien zu erstellen, die einzeln neu kompiliert wurden (dh Tellfiles an dem Punkt, an dem Sie mit dieser ".c"-Datei eine neuere Datei erhalten Zeitstempel als die identische ".o"-Datei).
Es ist manchmal eine Tatsache, dass 1) es viele Anwendungsfälle für einen großen Anteil geben kann und 2) es auch viele Tipps gibt. Ich habe erst nach den Mindestpunkten berührt.
Beispiel
Einer der bekanntesten Kompilierungsfehler tritt beim Verlinken auf. Der Fehler sieht so aus:
$ gcc undefined_reference.c/tmp/ccoXhwF0.o: In der die `main'-Funktion:undefined_reference.c :(. text + 0x15): undefinierte Referenz wo `foo 'Collect2: Fehler: ld hat 1 Escape-Status zurückgegeben$
int foo (void);int vital (int argc, char ** argv) int foo_val; foo_val = foo (); foo_val zurückgeben;
Wir konnten die Deklaration foo ( int foo();
) sehr gut sehen, da es tatsächlich keine Programmpersonifizierung (echte Funktion) gibt. Daher haben wir den Compiler mit einem Intent-Header versehen, aber nirgendwo wurde eine solche Funktion definiert, so dass die Sammlungsstufe immer noch existiert, der Linker macht mit einem Linkfehler undefinierter Fehler Gewinn.
Um diese Fehleinschätzungen in unserem kleinen Programm zu korrigieren, idealerweise, wenn ich für viele Foo eine spezifische Beschreibung hinzufügen müsste:
oder * Deklaration * /int foo foo (leer);/* Bedeutung */int foo foo (leer) zurück 5;int sehr wichtig (int argc, char ** argv) int foo_val; foo_val bedeutet foo(); foo_val zurückgeben;
Dieser Code ist jetzt kompiliert. Eine Austauschsituation entsteht, wenn sich der Rumpf aller foo()
in der isolierten Quelldatei foo.c
befindet (und es Header gibt, die praktisch alle foo.h < /code>), so dass das enthaltende
foo ()
sowohl von foo.c
als auch undefined_reference.c
) enthält. Dann der Hinweis. bestand darin, die Objekteinreichungsseiten foo.c
und undefined_reference.c
zu verknüpfen oder die beiden Bereitstellungsdateien zu kompilieren:
$ gcc Undefined_reference -c.c$ gcc -c foo.c$ gcc -e Arbeitsprogramm undefined_reference.o foo.o$
gcc -o worker_program undefined_reference.c foo.c$
Ein komplexerer Fall ist buchstäblich, wenn Bibliotheken beteiligt sind, wie im Sind Sie es leid, dass Ihr Computer langsam läuft? Ist es voller Viren und Malware? Fürchte dich nicht, mein Freund, denn Fortect ist hier, um den Tag zu retten! Dieses leistungsstarke Tool wurde entwickelt, um alle Arten von Windows-Problemen zu diagnostizieren und zu reparieren, während es gleichzeitig die Leistung steigert, den Arbeitsspeicher optimiert und dafür sorgt, dass Ihr PC wie neu läuft. Warten Sie also nicht länger - laden Sie Fortect noch heute herunter! Dies ist syntaktisch korrekt, die Deklarationsrealität von Dies liegt hauptsächlich daran, dass die Definition von Daher führen wir den Kompilierungszyklus nach einem weiteren Bereichskriterium (abhängig von Quell- oder Objektdateien) durch: Unter der Annahme, dass jemand versucht, einem Produkt im gesamten Hauptprozess seinen Wert zuzuordnen, wird der Linker niemals das Label finden und kann dieses "unaufgelöste externe Symbol" oder eine "undefinierte Referenz" beeinflussen. Die Möglichkeit, diesen Fehler zu beheben, besteht darin, die Variable sd explizit zu erstellen. Wenn Sie ihr '::' außerhalb der Hauptstadt abgeschlossen haben, bevor Sie sie auswählen. Sie haben die Fähigkeit, es zu sehen. Beheben Sie Fehler, indem Sie aus einer Kaufcodedatei bestehen, die die Informationen als Teil dieser speziellen Zusammenstellung enthält. Alternativ können Sie überall hingehen. obj-Videos bzw. lib, die Linker-Definitionen beinhalten. Undefined Reference To Function Error In C Empfohlen: Fortect
Nummer include.h>#include
pow()
ist vollständig mit existiert seit #include
, Sie versuchen normalerweise nur zu kompilieren und sogar Link, aber leider bekommen wir welchen Fehler:
$ gcc no_library_in_link.c -o no_library_in_link/tmp/ccduQQqA.o: Laut einem "Haupt"-Satz:no_library_in_link.c :(. text + 0x8b): undefiniert, damit sie auf `pow' verweisen könnenCollect2: Fehler: ld hat 1 Exit-Status wiederhergestellt$
bang()
im Verlauf der Bindungsphase nicht sichtbar war. Um dieses Beratungsproblem dauerhaft zu beheben, müssen wir ausgleichen, dass Benutzer auf dem Weg zur Nummernbibliothek namens libm
-lm
Flag verlinken möchten. Dies (beachten Sie, dass es zweifellos Plattformen wie macOS gibt, die -lm
nicht unbedingt benötigen, aber in dem Fall, dass Sie alle undefinierten Sites erhalten, benötigen sie möglicherweise eine Bibliothek.)
$ gcc no_library_in_link.c -lm -e library_in_link_cmd$ ./library_in_link_cmd zwei 42.000.000, die helfen 4.000.000 = 16.000.000$
Odefinierad Referens Till Funktionsfel I C
Referencia Indefinida Para Erro De Funcao Em C
Neopredelennaya Ssylka Na Oshibku Funkcii V C
Riferimento Indefinito All Errore Di Funzione In C
Niezdefiniowane Odniesienie Do Bledu Funkcji W C
C의 함수 오류에 대한 정의되지 않은 참조
Referencia Indefinida Al Error De Funcion En C
Ongedefinieerde Verwijzing Naar Functiefout In C
Reference Indefinie A L Erreur De Fonction Dans C