Frage

Ich habe ein Problem mit meinem Compiler sagt mir, es ist ein ‚undefined Verweis auf‘ eine Funktion, die ich in einer Bibliothek verwendet werden soll. Lassen Sie mich auf das Problem ein paar Informationen teilen:

  • Ich bin Kreuzkompilierung mit gcc für C.
  • Ich rufe eine Bibliotheksfunktion, die durch einen eingeschlossenen Header zugegriffen wird, die einen anderen Header enthält, der den Prototyp enthält.
  • Ich habe das Header-Verzeichnis mit -I enthalten, und ich bin sicher, dass es gefunden werden.
  • Ich erstelle zuerst die .o-Dateien dann in einem separaten Befehl zu verbinden.

Also mein Gedanke ist, es könnte die Reihenfolge, in der ich die Bibliotheksdateien enthalten, aber ich bin nicht sicher, was der richtige Weg ist, um sie zu bestellen. Ich habe versucht, mit einschließlich der Header-Ordner sowohl vor als auch nach der .o-Datei.

Einige schlägt vor, wäre großartig, und vielleicht und Erklärung, wie die Linke tut seine Sache.

Danke!


Antwort auf Antworten

  • gibt es keine .a Bibliotheksdatei, nur .h und .c in der Bibliothek, so -l ist nicht geeignet
  • mein Verständnis einer Bibliotheksdatei ist, dass es nur eine Sammlung von Header und Quelldateien, aber vielleicht ist es eine Sammlung von .o Dateien aus der Quelle erstellt?!
  • gibt es keine Bibliothek Objektdatei erstellt wird, vielleicht sollte es sein ?? Ja scheint, ich verstehe nicht den Unterschied zwischen enthält und Bibliotheken ... i daran arbeiten werde: -)

Danke für alle Antworten! Ich habe viel gelernt über Bibliotheken. Ich möchte alle Antworten als die akzeptierte Antwort setzen: -)

War es hilfreich?

Lösung

Es klingt wie Sie nicht die C-Datei in der Bibliothek kompiliert werden eine .o-Datei zu erzeugen. Der Linker für die Umsetzung des Prototyps aussehen würde in der .o-Datei erzeugt, indem die Bibliothek Kompilieren

Hat Ihr Build-Prozess kompiliert die Bibliothek C-Datei?

Warum Sie nennen es eine „Bibliothek“, wenn es eigentlich nur Quellcode?

Andere Tipps

Headers bieten Funktionsdeklarationen und Funktionsdefinitionen. Damit findet der Linke die Umsetzung der Funktion (und werdet die nicht definierten Referenz los) benötigen Sie den Compiler-Treiber (gcc) zu bitten, die bestimmte Bibliothek zu verknüpfen, wo die Funktion mit der Option -l befindet. Zum Beispiel wird -Im die Mathematik-Bibliothek verknüpfen. Eine manuelle Seite Funktion der Regel legt fest, welche Bibliothek, falls vorhanden, muss die Funktion zu finden, angegeben werden.

Wenn der Linker kann nicht eine bestimmte Bibliothek finden Sie einen Bibliothek-Suchpfad hinzufügen, können die -L Schalter (zum Beispiel -L / usr / local / lib). Sie können auch den Bibliothekspfad durch die LIBRARY_PATH Umgebungsvariablen beeinflussen dauerhaft.

Hier sind einige weitere Details, die Sie debuggen Ihr Problem zu helfen. Vereinbarungsgemäß werden die Namen der Bibliotheksdateien mit lib Präfix und (in ihrer statischen Form) eine .a-Erweiterung. Somit ist die statisch gelinkte Version der Standard-Mathematik-Bibliothek des Systems (die Sie mit -Im Link) befindet sich normalerweise in /usr/lib/libm.a. Um zu sehen, welche Symbole eine gegebene Bibliothek definiert können Sie laufen nm --defined-nur auf der Bibliotheksdatei. Auf meinem System auf libm.a man den Befehl gibt mir Ausgabe wie folgt aus.

e_atan2.o:
00000000 T atan2

e_asinf.o:
00000000 T asinf

e_asin.o:
00000000 T asin

den Bibliothekspfad zu sehen, dass Ihr Compiler verwendet und welche Bibliotheken es standardmäßig lädt können Sie gcc mit der Option -v aufzurufen. Wieder auf meinem System das gibt die folgende Ausgabe.

GNU assembler version 2.15 [FreeBSD] 2004-05-23 (i386-obrien-freebsd) 
using BFD version 2.15 [FreeBSD] 2004-05-23
/usr/bin/ld -V -dynamic-linker /libexec/ld-elf.so.1 /usr/lib/crt1.o 
/usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/lib /var/tmp//ccIxJczl.o -lgcc -lc 
-lgcc /usr/lib/crtend.o /usr/lib/crtn.o

Ich fürchte, Sie die Bibliothek und Header-Konzepte gemischt. Angenommen, Sie haben eine Bibliothek libmylib.a haben, der die Funktion myfunc() und einen entsprechenden Header mylib.h enthält, dessen Prototyp definiert. In Ihrer Quelldatei myapp.c schließen Sie den Header, entweder direkt oder mit einem anderen Header, die es enthält. Zum Beispiel:

/* myapp.h
** Here I will include and define my stuff
*/
...
#include "mylib.h"
...

Ihre Quelldatei wie folgt aussieht:

/* myapp.c
** Here is my real code
*/
...
#include "myapp.h"
...
/* Here I can use the function */
myfunc(3,"XYZ");

Jetzt können Sie kompilieren myapp.o zu erhalten:

gcc -c -I../mylib/includes myapp.c

Beachten Sie, dass die -I nur gcc sagt, wo die Header-Dateien sind, sie haben nichts mit der Bibliothek selbst zu tun!

Jetzt können Sie Ihre Anwendung mit der realen Bibliothek verknüpfen:

gcc -o myapp -L../mylib/libs myapp.o -lmylib

Beachten Sie, dass der -L Schalter teilt gcc, wo die Bibliothek und die -l sagt es Ihren Code in die Bibliothek zu verbinden.

Wenn Sie nicht diesen letzten Schritt tun, können Sie das Problem stoßen Sie beschrieben.

Es könnte andere, komplexere Fälle geben, aber aus Ihrer Frage, ich hoffe, dass dies ausreichen würde, um Ihr Problem zu lösen.

Hier können Sie Ihr Make-Datei und die Bibliothek Funktion, die Sie versuchen, zu nennen. Selbst einfache gcc Makefiles in der Regel eine Zeile wie diese haben:

LIBFLAGS =-lc -lpthread -lrt -lstdc++ -lShared -L../shared

In diesem Fall bedeutet es die Standard-C-Bibliothek verknüpfen, unter anderem

Ich denke, Sie haben den Pfad hinzuzufügen, wo der Linker die libraray finden. In gcc / ld Sie mit -L dies tun kann und libraray mit -l.

  

-Ldir, --library-path = dir

     

Such Verzeichnis dir vor Standard   Suchverzeichnisse (diese Option muss   voraus die Option -l, die sucht   das Verzeichnis).

     

-larch, --library = Archiv

     

Fügen Sie die Archivdatei Bogen in der   Liste der Dateien zu verknüpfen.


  

Antwort auf Antworten - es gibt keine .a Bibliotheksdatei, nur .h und .c in der Bibliothek, so -l nicht approriate ist

Dann müssen Sie unter Umständen die libraray erstellen Sie zuerst?

gcc -c mylib.c -o mylib.o
ar  rcs libmylib.a      mylib.o

Ich habe dieses Problem auftreten, wenn ein Programm mit einer neuen Version von gcc zu bauen. Das Problem wurde behoben von gcc mit der -std = gnu89 Option aufrufen. Anscheinend war dies auf Inline-Funktion Erklärungen fällig. Ich habe diese Lösung unter https://gcc.gnu.org/gcc-5/porting_to gefunden .html

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