"Undefined reference" an eine Funktion definiert, die in der statischen Bibliothek
Ich versuche, erstellen Sie eine Bibliothek in einer Anwendung zu verwenden. Ich baute die Bibliothek als unten, und wenn ich die Anwendung kompilieren, bekomme ich die folgende Fehlermeldung:
Ich habe das getan beolw Dinge.
Benutze ich:
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
In der Bibliothek aus aufgerufen werden Anwendung:
Hier ich habe eine Menge Module, aber Einstiegspunkt für diese Bibliothek ist func()
(d.h., main () wird ersetzt mit func (), so dass ich das Modul aufrufen, auch func () ist nicht deklariert als 'static'.)
In einer der Dateien:
int func ();
...
int func ()
{ ... }
Dann baute die Bibliothek als:
gcc -Wall file.c -o file.o
...
...
ar rvs libfun.a $(OBJS)
Auch verwendet ranlib-und nm -s auf libfun.ein separat zu bauen, symbol, Tisch,
aber die Gesamtgröße der archive ändert sich nicht, nach der Verwendung dieser Befehle und ist immer noch das linking-Fehler.
Hier $(OBJS) enthält alle Objekt-Dateien
In Anwendung:
extern int func ();
Kompilieren mit:
gcc -Wall -L./path-to-lib -lfun -o appl
Dann bekomme ich die folgende Fehlermeldung:
In function `main':
undefined reference to `func()'
collect2: ld returned 1 exit status
Habe ich versucht zu bauen Symboltabelle mit "ar s" und "ranlib" aber das Ergebnis ist dasselbe.
Eine Sache, die ich beobachtet habe ist, dass es einen Unterschied im Inhalt von "ar", die ich gebaut und die Archive bereits im Projekt für andere Module.
Archiv gebaut von mir enthält (Ausgang mit "nm -s libfun.ein" ):
Archive index:
Cfg1 in f1.o
mCfg1 in f1.o
dpCfg in f1.o
Aber die anderen Archive die ich benutze, ohne irgendwelche änderungen enthalten, die unter seltsamen Muster:
Archive index:
_Z29platformSetjP38tagTCPIP_INTERFACE_INSTANCE_ATTRIBUTES in platform.o
_Z27platformTestSetTcpjP20tagTCPIP_CONFIG_DATAPh in platform.o
_Z23platformSetTcpIpjP20tagTCPIP_CONFIG_DATA in platform.o
Ich bin nicht sicher, was ist der Unterschied oben. Ist es eine shared-Library, oder eine Statische Bibliothek ?
Ich versuche zu kompilieren mit GCC und build-Archiv mit 'ar', sondern die andere Bibliothek-Dateien kann mit g++ - compiler. Ich bin mir nicht sicher. Nur für den Fall ist es wichtig.
Was mache ich hier falsch in dem Bau meiner Bibliothek ? Bitte helfen?
Grüße.
gcc -Wall -L./path-to-lib -lfun -o appl
es gibt keine source - /Objekt-Datei, die hier erwähnt, so dass ich vermute, es ist am Ende angehängt. Die Bibliothek, in Verbindung mit, wahrscheinlich muss gehen, nach der Quelle, so bewegen-lfun
an das Ende der Befehlszeile.- Ja, ich habe OBJS enthält alle kompilierten Quellen der Anwendung beim kompilieren der definitiven Anwendung. Ich versuchte, verschieben Sie die Bibliotheken ($(LIBS) alles rund um die Befehlszeile, aber es hat nicht geholfen. ich benutze cross-compiler für ARM-embedded-Prozessoren. ** $(CROSS_COMPILE)gcc-Wall -o appl $(OBJS) -L./Pfad-zu-lib -lfun **
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein weiterer Grund kann die falsche Reihenfolge Ihrer
-lxx
.In kurz, put
-lrelied
nach-lrelying
.sehen hier.
-l
flag - Angehörige müssen als erste gehen, dann deren Abhängigkeiten. Die-fPIC
- flag hat damit nichts zu tun. Absolut dumm. Warum kann nichtld
verwerfen Zeug in der späteren Phase?Fand ich heraus, der Grund für den Fehler.
Ich war die Vermischung der statischen Bibliothek mit anderen Bibliotheken kompiliert mit position independent code (PIC) und einige andere flags. Hinzufügen diese flags das Problem gelöst.