2013-02-15 17 views
15

Ich habe ein Problem beim Erstellen einer gemeinsam genutzten Bibliothek mit GCC/Linux. Derzeit wird diese gemeinsam genutzte Bibliothek mit der GCC/libtool Option "-shared" erstellt und alles ist in Ordnung.Eine statische Bibliothek während des Builds mit einer gemeinsamen verknüpfen?

Jetzt gibt es zwei zusätzliche, statische Bibliotheken (.a-Dateien), die zu dieser freigegebenen hinzugefügt werden müssen, da sie einige Funktionen bereitstellen, die von der gemeinsamen benötigt werden. Das Hinzufügen dieser statischen Bibliotheken mit der Option "-l" hilft nicht, danach sind sie nicht Teil der .so-Datei.

Also, wie kann ich zwingen, GCC/libtool wirklich den Code dieser statischen Bibliotheken zur gemeinsamen Bibliothek hinzufügen?

Danke!

+0

Für ausführbare Dateien Erstellen Sie den vollständigen Pfad der statischen Bibliothek zu den Baumöglichkeiten von gcc nur hinzufügen können, zB: 'gcc -Wall -g live_mystuff.c -o my_app /usr/local/src/ffmpeg/libswscale/libswscale.a -lpthread -lbz2 -lm -lz -lfaac -lmp3lame -lx264 -lfaad ...' Es könnte auch zum Erstellen von gemeinsamen Bibliotheken funktionieren. Versuch es. – fritzone

+0

Woher wissen Sie, dass sie "nicht Teil der .so Datei" sind? –

+0

@fritzone: für ausführbare Dateien, die ohne Probleme funktioniert, muss ich es für eine gemeinsame Bibliothek tun – Elmi

Antwort

21

Sie benötigen in diesem Fall die Linkeroption --whole-archive, um den Linker anzuweisen, den gesamten Inhalt der statischen libs in die gemeinsam genutzte Bibliothek einzuschließen.

g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive 

Von man ld:

Für jedes Archiv in der Befehlszeile nach der Option --whole-Archiv erwähnt, umfassen jede Objektdatei im Archiv in der Verbindung, anstatt die Suche Archiv für die erforderlichen Objektdateien. Dies wird normalerweise verwendet, um eine Archivdatei in eine gemeinsam genutzte Bibliothek umzuwandeln, wobei jedes Objekt gezwungen wird, in der resultierenden gemeinsam genutzten Bibliothek enthalten zu sein. Diese Option kann mehrmals verwendet werden.

Zwei Hinweise bei Verwendung dieser Option von gcc: Erstens, GCC weiß nicht über diese Option, also müssen Sie -Wl, -whole-archive verwenden. Zweitens, vergessen Sie nicht, -Wl, -no-whole-archive nach Ihrer Liste von Archiven zu verwenden, da gcc eine eigene Liste von Archiven zu Ihrem Link hinzufügen wird und Sie nicht wollen, dass diese Markierung auch diese betrifft.

+0

auf SunOS Ich musste bot Bindestriche nach '-WL,'. – stefanct

2

Sie müssen nur die --whole-Archiv Parameter Kraft der Linker, die Bibliothek schließen, aber es sollte den eigenen Bedarf aus unübertroffenen Symbole ableiten können.

Stellen Sie sicher, dass alle statischen Bibliotheken auf der Kommandozeile kommen, nachdem ihre abhängigen Objekt-Dateien zB:

g++ -Wl,-E -g -pipe -O2 -pipe -fPIC myobjectfile.o mystaticlibrary.a -shared -o mylib.so 
Verwandte Themen