Warum SO in A konvertieren?
Entwickler ersetzen eine gemeinsam genutzte .so durch eine statische .a, um eine eigenständige Binärdatei zu erstellen, die zur Laufzeit nicht von der Anwesenheit der .so abhängt - nützlich bei der Bereitstellung auf Rechnern, auf denen die Bibliothek möglicherweise nicht installiert ist. Eine .a ist ein Archiv im ar-Format aus kompilierten Objektdateien, während eine .so ein vollständig verknüpftes ELF-Shared-Object ist; beide werden in unterschiedlichen Phasen aus demselben Quellcode erstellt.
Wie man SO in A konvertiert
ar (binutils) OPEN-SOURCE
Kompilieren Sie Quelldateien zu Objektdateien (gcc -c -o foo.o foo.c) und führen Sie dann ar rcs libfoo.a *.o aus, um sie in einem statischen .a-Archiv zu bündeln.
GCC / Clang OPEN-SOURCE
Führen Sie ./configure --enable-static && make im Quellverzeichnis der Bibliothek aus, um die .a neben oder anstelle der .so zu erstellen.
apt / dnf / pacman FREE
Installieren Sie das -dev- oder -static-Paket der Bibliothek (z. B. apt install libfoo-dev), um die vorkompilierte .a zu erhalten, ohne aus dem Quellcode zu bauen; statische Archive werden normalerweise in /usr/lib/ abgelegt.
Über diese Formate
Eine .so-Datei ist eine Shared-Object-Bibliothek unter Linux und Unix - das Linux-Äquivalent einer Windows-.dll-Datei. Programme laden sie automatisch zur Laufzeit; du öffnest sie nie…
.SO-Details öffnen →Eine .a-Datei ist eine statische Bibliothek, die auf Unix, Linux und macOS verwendet wird. Sie ist ein ar-Format-Archiv aus kompilierten Objektdateien, das der Linker zur Build-Zeit in dein…
.A-Details öffnen →Qualität & worauf zu achten ist
- Eine
.soverwendet positionsunabhängigen Code (kompiliert mit-fPIC); das Mischen von PIC-Objektdateien in eine.a, die in eine Nicht-PIE-Ausführungsdatei gelinkt wird, kann manchmal Linker-Warnungen verursachen, funktioniert aber normalerweise. - Versionsnummern in
.so-Dateinamen (z. B.libssl.so.3.0.2) haben keine Entsprechung in.a- statische Bibliotheken tragen keinen SONAME. - Wenn nur die fertige
.soohne Quellcode oder Paket verfügbar ist, gibt es keinen binären Konverter - Sie müssen die statische Bibliothek aus dem Quellcode beziehen oder bauen.
Häufig gestellte Fragen
Kann ich Objektdateien aus einer `.so` extrahieren, so wie ich es bei einer `.a` kann?
.so zusammengeführt und modifiziert; ar x funktioniert bei .a-Archiven, aber nicht bei .so-Dateien.Warum sollte man eine `.a` anstelle einer `.so` verwenden?
.so nicht installiert ist, was die Bereitstellung in minimalen oder isolierten Umgebungen vereinfacht.Wo landet die statische `.a` nach der Installation eines `-dev`-Pakets?
/usr/lib/x86_64-linux-gnu/libfoo.a unter Debian/Ubuntu oder dem entsprechenden Bibliothekspfad auf anderen Distributionen.