2016-11-29 6 views
1

Um dies einfach zu halten ... nehme ich an: A.lib, libB.so (die A.lib verwendet) und C.exe (die libB verwendet. damit). Hinweis: Dies ist Linux, nicht Windows. Ich benutze nur .exe, um binären Typ/Zweck zu vermitteln.Verknüpfung mit .so in g ++ führt zu undefinierten Referenzen

Ich versuche nur zu kompilieren und C.Exe von der Eingabeaufforderung zu verbinden, da es nur ein einfaches Testprogramm ist. Das ist die Linie Ich verwende:

g++ -I../include C.cpp -o C.exe -L../lib -lB 

Das Ergebnis ist viele undefinierte Verweise auf Dinge, die in A.lib gefunden werden würde. Es gibt keine Fehler, die auf irgendetwas verweisen, das von libB.so exportiert wurde.

Wenn ich libB.so auf dasselbe Verzeichnis kopieren und verwenden Sie diesen Befehl:

g++ -I../include C.cpp -o C.exe -lB 

Das Ergebnis ist c.exe aufgebaut und kann ohne Fehler ausgeführt werden.

Sobald libB.so Build ist, sollte ich nicht die libs, die verwendet wurden, um es zu bauen. Trotzdem dachte ich, ich würde etwas als letzten Versuch versuchen. Ich habe A.lib in das gleiche lib-Verzeichnis wie libB.so kopiert und den ursprünglichen Build-Befehl erneut versucht. Das Ergebnis war das gleiche.

Alle und alle Gedanken geschätzt.

+0

Wie hast du 'libB.so' verlinkt? Hast du explizit mit "A.lib" verlinkt? –

+0

Verwenden Sie die Option '-R' zusätzlich zu' -L'. Weitere Informationen finden Sie auf der Man Seite von 'ld'. –

+0

Übrigens, ist die 'A'-Bibliothek eine * statische * Bibliothek oder eine * dynamische * Bibliothek? –

Antwort

0

SamVershavchik brachte mich auf den Weg zu der Antwort. Ich habe diesen Befehl zuerst ausprobiert:

Das Ergebnis war ein sauberer Build, aber ein weiterer Fehler über fehlende Symbole, wenn ich C.exe lief.

I modifiziert, um den Befehl an die folgende:

g++ -I../include C.cpp -o C.exe -Wl,-R,--just-symbols=../lib/libB.so -lB 

Dies führte zu einem sauberen Aufbau und die Fähigkeit c.exe ohne Fehler auszuführen.

Verwandte Themen