2010-02-03 8 views
9

der Titel dieser Frage ist ein exact dupe, aber die Antworten in dieser Frage helfen mir nicht.Konvertieren Sie eine statische Bibliothek in eine gemeinsame Bibliothek (Erstellen libsome.so von libsome.a): wo ist meine Symbole?

Ich habe eine Reihe von Objektdateien in einer statischen Bibliothek verpackt:

% g++ -std=c++98 -fpic -g -O1 -c -o foo.o foo.cpp 
% g++ -std=c++98 -fpic -g -O1 -c -o bar.o bar.cpp 
% ar -rc libsome.a foo.o bar.o 

I libsome.so von libsome.a anstelle der Objektdateien erzeugen möchten, aber die Bibliothek ist wirklich Barebones:

% g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so libsome.a 
% nm -DC libsome.so 
0000xxxx A _DYNAMIC 
0000xxxx A _GLOBAL_OFFSET_TABLE_ 
     w _Jv_RegisterClasses 
0000xxxx A __bss_start 
     w __cxa_finalize 
0000xxxx A _edata 
0000xxxx A _end 
0000xxxx T _fini 
0000xxxx T _init 

die statische Bibliothek ist in Ordnung, oder zumindest ich bin durchaus in der Lage, es zu einer ausführbaren Datei zu verknüpfen und habe es die enthaltene Funktionalität auszuführen. auch, alles ist in Ordnung, wenn ich libsome.so von foo.o und bar.o erstellen.

Antwort

22

Angenommen, Sie verwenden den GNU-Linker, müssen Sie die Option --whole-archive angeben, damit Sie den gesamten Inhalt des statischen Archivs erhalten. Da das ist eine Linker-Option, müssen Sie -Wl gcc sagen, dass es an den Linker passieren:

g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so -Wl,--whole-archive libsome.a 

Wenn Sie etwas komplizierter tun, wo Sie alle Bibliothek wollen einige, aber nur der Teil der Bibliothek Unterstützung von libsome benötigt würden Sie gesamtes Archiv deaktivieren, nachdem Sie es auf libsome verwendet haben:

... -Wl,--whole-archive libsome.a -Wl,--no-whole-archive libsupport.a 

wenn Sie nicht mit den GNU-Linker verwenden, müssen Sie, um zu sehen, ob Ihr Linker unterstützt und wie es heißt. Auf dem Sun Linker heißt es -z allextract und -z defaultextract.

+0

+1 Da gehts los. Ich habe versucht "Mann ld" und habe das verpasst. –

+0

danke, das ist es! Ich habe die Manpage von ld nach oben und unten durchsucht, aber irgendwie diese Option verpasst. –

+0

Nun, wenn nur diese ausgezeichnete Antwort auch zeigen würde, wie man dies mit einem CMake-Projekt einrichtet! Vielen Dank –

1

Ihre Dateien werden nicht aus der .a-Datei abgerufen, da nichts darauf verweist. Warum machst du zuerst eine .a-Datei? Sie hätten mehr Glück beim Erstellen einer O-Datei, indem Sie sie mit der Option -r verknüpfen.

+0

Wenn ich libsome.so von foo.o und bar.o baue, verweist auch nichts auf die Symbole, und doch landen sie in der Bibliothek. und da die '.a' Datei genau diese zwei exakten' .o' Dateien ist, die zusammen getippt werden, sollte * eine * (einfache) Möglichkeit sein, sie anstelle der enthaltenen Objektdateien zu benutzen, nein? –

+0

Da Objektdateien nur dann aus einer .a-Datei abgerufen werden, wenn auf ein Symbol in ihnen verwiesen wird. Eine .o-Datei ist immer verlinkt, referenziert oder nicht. –

+0

ok, die Besonderheiten meiner Situation ignorierend: Gibt es oder gibt es keine Möglichkeit, eine statische Bibliothek in eine gemeinsame zu konvertieren *, als ob * die '.o' Dateien verwendet würden? (discounting 'ar -x') –

Verwandte Themen