Konvertieren Sie eine statische Bibliothek in eine gemeinsam genutzte Bibliothek?

Lesezeit: 3 Minuten

Benutzeravatar von Eli Courtwright
Eli Gerichtsschreiber

Ich habe eine Bibliothek eines Drittanbieters, die hauptsächlich aus einer großen Anzahl statischer (.a) Bibliotheksdateien. Ich kann dies zu einer einzigen kompilieren .a Bibliotheksdatei, aber ich brauche wirklich eine Single .so freigegebene Bibliotheksdatei.

Gibt es eine Möglichkeit, ein statisches zu konvertieren .a Datei in eine freigegebene .so Datei? Oder allgemeiner gesagt, gibt es eine gute Möglichkeit, eine große Anzahl statischer Elemente zu kombinieren .a Dateien mit ein paar .o Objektdateien in eine einzige .so Datei?

Benutzeravatar von dicroce
dicroce

Tut dies (mit entsprechenden -L’s natürlich)

gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib

Nicht tun?

  • Die Verwendung von gcc -shared hat funktioniert, aber erst nachdem ich mit -fPIC neu kompiliert habe. Danke, dass du mich in die richtige Richtung weist!

    – Eli Courtwright

    17. März 2009 um 17:30 Uhr

  • Ich weiß, das ist eine alte Antwort, aber es … funktioniert nicht? Bei jeder statischen Bibliothek, die ich ausprobiert habe, exportiert das resultierende gemeinsame Objekt keines der ursprünglichen Symbole mehr.

    – Petrus

    12. August 2020 um 12:09 Uhr

  • Ich bin auf das gleiche Problem gestoßen @Peter

    – Andre Cruz

    29. Juli 2021 um 13:18 Uhr


  • @ Peter: Ich vermute, du verwendest keine .o Dateien überhaupt, und nur versuchen, direkt von der statischen Lib in die dynamische Lib zu konvertieren, die dieselben Symbole bereitstellt. Wenn dies der Fall ist, gibt es einen Trick, um dem Linker mitzuteilen, dass er alle nicht verwendeten Namen aus dem Archiv enthalten soll, die Sie verwenden müssen.

    – ShadowRanger

    10. Mai um 17:40 Uhr

Sie können dies nicht tun, wenn Objekte in der statischen Bibliothek ohne -fPIC oder ähnliches kompiliert wurden.

  • Auf gut unterstützten Zielen, PIC ist für gemeinsam genutzten Bibliothekscode nicht unbedingt erforderlich. Es führt nur zu einer viel effizienteren Nutzung des Speichers (die Mehrheit statt einer Minderheit der Seiten kann gemeinsam genutzt werden) auf Kosten einer gewissen Leistung.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    4. Oktober 2010 um 16:42 Uhr

  • Das Fehlen von -fPIC oder ähnlichem führt unter bestimmten Bedingungen zu SegFault

    – vitaly.v.ch

    1. November 2010 um 9:33 Uhr

Benutzeravatar von Calm
Ruhig

g++ -shared -o megalib.so foo.o bar.o -Wl,--whole-archive -la_static_lib -lb_static_lib -Wl,--no-whole-archive -lc_static_lib -lother_shared_object

Bei gcc bin ich mir nicht sicher, aber für g++ musste ich die Linker-Option –whole-archive hinzufügen, um die Objekte aus den statischen Bibliotheken in das gemeinsam genutzte Objekt aufzunehmen. Die Option –no-whole-archive ist notwendig, wenn Sie auf libc_static_lib.a und libother_shared_object.so verlinken, sie aber nicht als Ganzes in megalib.so einbinden möchten.

  • -Wl--no-whole-archive ist am Ende der Befehlszeile erforderlich. Siehe die Bearbeitung der Frage hier.

    – ofavre

    7. August 2012 um 20:52 Uhr

Benutzeravatar von Anastasios Andronidis
Anastasios Andronidis

ar -x kann auch nützlich sein, wenn Sie sich auf bestimmte Objekte von Ihrem konzentrieren möchten .as und Sie möchten nichts selbst hinzufügen.

Beispiele:

ar -x lib***.a
gcc -shared *.o -o lib***.so

ar -x lib***.a
gcc -shared *.o -o lib***.so

  • Wurde dies nicht nur einer anderen früheren Antwort entnommen und mit weniger Kontext / Erklärung gepostet?

    – Dan

    11. September 2019 um 17:34 Uhr

  • Nein, eine solche Antwort gab es damals nicht. Siehe Geschichte.

    – Artur Schaikhullin

    13. September 2019 um 0:19 Uhr

  • Ich hätte schwören können, dass im Webbrowser das Datum für das andere früher angezeigt wurde, aber in der Telefon-App wird angezeigt, dass dieses zuerst war. Entschuldigen Sie!

    – Dan

    13. September 2019 um 9:06 Uhr

  • Wurde dies nicht nur einer anderen früheren Antwort entnommen und mit weniger Kontext / Erklärung gepostet?

    – Dan

    11. September 2019 um 17:34 Uhr

  • Nein, eine solche Antwort gab es damals nicht. Siehe Geschichte.

    – Artur Schaikhullin

    13. September 2019 um 0:19 Uhr

  • Ich hätte schwören können, dass im Webbrowser das Datum für das andere früher angezeigt wurde, aber in der Telefon-App wird angezeigt, dass dieses zuerst war. Entschuldigen Sie!

    – Dan

    13. September 2019 um 9:06 Uhr

1415250cookie-checkKonvertieren Sie eine statische Bibliothek in eine gemeinsam genutzte Bibliothek?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy