2017-06-27 4 views
2

Ich möchte eine .SO-Datei mit allen Bibliotheken (GMP und PROTOBUF) statisch verknüpft erstellen, so dass es in anderen Systemen verwendet werden kann, ohne diese Bibliotheken zu installieren.Wie erstelle ich .so-Dateien mit allen statisch verknüpften Bibliotheken?

Dies ist, was ich für MAC tat

gcc -I /usr/local/include -shared -o xyz.so -g xyz.c /usr/local/lib/libprotobuf-c.a /usr/local/lib/libgmp.a 

Aber es für Linux funktioniert nicht. Wie kann ich es für Linux arbeiten lassen?

Antwort

2

Eine gemeinsame library sollte (unter Linux) praktisch position-independent code (PIC) enthalten. So ist der richtige Weg, um eine gemeinsam genutzte Bibliothek libxyz.so aus einer einzigen Quelldatei zu bauen xyz.c ist

gcc -Wall -g -shared -I/usr/local/include -o libxyz.so -fPIC xyz.c 

(und Sie könnten wollen -und wahrscheinlich rpath Optionen 'to add)

Eine statische Bibliothek don 't enthalten PIC (es sei denn, es war speziell als solches gebaut, die unter Linux sehr ungewöhnlich ist; auf Debian das einzige Beispiel, das ich kenne, ist die spezielle libc6-pic Paket zur Verfügung gestellt, um Build von benutzerdefinierten und erweiterten libc*so zu erleichtern).

Sie müssen PIC-Varianten dieser Bibliotheken verknüpfen; also sollten Sie sie aus ihrem Quellcode erstellen.

Lesen Drepper How To Write Shared Libraries für mehr, und auch Program Library HowTo.

(In einige wenige theoretischen seltsam Fällen könnten Sie eine gemeinsam genutzte Bibliothek verknüpfen, die PIC nicht enthalten, aber das wird ihre dynamic linking extrem langsam machen, da viele relocations verarbeitet werden würden und ihre code segment nicht -zwischen mehrere processes- durch entsprechende Anrufe mmap(2) von ld-linux(8) getan geteilt werden, dies ist nicht überhaupt empfohlen wird, ist sehr spröde und wird oft nicht gut, ich habe nie)

Ich möchte eine .so-Datei mit allen Bibliotheken (GMP und protobuf) statisch in das

Tun Sie das nicht, dass verknüpft erstellen. Ich erklärte warum. Und das ist gegen die (sozialen) Regeln von Linux (weil Ihre Benutzer keine Billionen von Varianten von libgmp haben wollen, etc ...).

Sie können jedoch eine gemeinsam genutzte Bibliothek mit einigen anderen (grundlegenderen) gemeinsam genutzten Bibliotheken verknüpfen. In deinem Fall empfehle ich das zu tun. Daher muss Ihr Benutzer GMP- und PROTOBUF-Pakete installiert haben.

Beachten Sie auch packages für Ihre (oder gemeinsam) Linux-Distributionen (zum Beispiel eine .deb Datei für Ubuntu oder Debian)

Alternativ bieten, veröffentlichen Sie Ihre Bibliothek Code als free software; Sie könnten dann hoffen, dass mehrere Benutzer ihre Quelle herunterladen würden, und vielleicht (irgendwann) würden einige Distributionen sie packen. Sie könnten Jahre darauf warten, dass das passiert; oder zumindest bekommt man Hilfe, um es zu verpacken.

+0

Danke. Ok ich verstehe, dass ich keine statischen Dateien verwenden darf. Ich habe stattdessen Runtime-Suchpfad wie folgt versucht: gcc -Wall -g -shared -I/usr/local/enthalten -o module.so-fPIC module.c-WL, -rpath,/usr/local/lib/libprotoc.so . Danach wurde module.so erfolgreich erstellt. Aber wenn das Modul geladen wird, hört es auf zu laden und sagt "undefined symbol: protobuf_c_message_pack". Das heißt also, die Bibliothek wird nicht an meiner Rpath Location durchsucht, oder? Hinweis: Für diese .so-Erstellung benötige ich kein GMP. Es verwendet nicht GMP – user3219492

+0

Ich empfehle dringend, einen Tag Drepper's lesen (https://www.akkadia.org/drepper/dsohowto.pdf). Du brauchst das Wissen dort. –

+0

Okay, ich werde das so schnell wie möglich tun – user3219492

Verwandte Themen