Waarom SO naar A converteren?
Ontwikkelaars vervangen een gedeelde .so door een statische .a om een zelfstandig binair bestand te produceren dat niet afhankelijk is van de aanwezigheid van de .so tijdens runtime - handig bij het implementeren op machines waar de bibliotheek mogelijk niet is geïnstalleerd. Een .a is een archief in ar-formaat van gecompileerde objectbestanden, terwijl een .so een volledig gekoppeld ELF gedeeld object is; beide worden in verschillende stadia vanuit dezelfde bron gebouwd.
Hoe SO naar A te converteren
ar (binutils) OPEN-SOURCE
Compileer bronbestanden naar objectbestanden (gcc -c -o foo.o foo.c) en voer vervolgens ar rcs libfoo.a *.o uit om ze te bundelen in een statisch .a archief.
GCC / Clang OPEN-SOURCE
Voer ./configure --enable-static && make uit in de bronmap van de bibliotheek om de .a naast of in plaats van de .so te bouwen.
apt / dnf / pacman FREE
Installeer het -dev of -static pakket van de bibliotheek (bijv. apt install libfoo-dev) om de vooraf gebouwde .a te krijgen zonder vanuit de broncode te bouwen; statische archieven worden meestal in /usr/lib/ geplaatst.
Over deze formaten
Een .so-bestand is een gedeelde bibliotheek (shared object library) op Linux en Unix - het Linux-equivalent van een Windows .dll. Programma's laden dit automatisch tijdens het uitvoeren; u…
Open .SO details →Een .a-bestand is een statische bibliotheek die wordt gebruikt op Unix, Linux en macOS. Het is een archief in ar-formaat met gecompileerde objectbestanden die de linker tijdens het bouwen…
Open .A details →Kwaliteit & waar op te letten
- Een
.sogebruikt positie-onafhankelijke code (gecompileerd met-fPIC); het mengen van PIC-objectbestanden in een.adie is gekoppeld aan een niet-PIE uitvoerbaar bestand kan soms linkerwaarschuwingen veroorzaken, maar werkt meestal wel. - Versienummers in
.sobestandsnamen (bijv.libssl.so.3.0.2) hebben geen equivalent in.a- statische bibliotheken dragen geen SONAME. - Als alleen de voltooide
.sobeschikbaar is zonder broncode of pakket, is er geen binair conversieprogramma - u moet de statische bibliotheek verkrijgen of bouwen vanuit de broncode.
Veelgestelde vragen
Kan ik objectbestanden uit een `.so` extraheren zoals ik dat uit een `.a` kan?
.so; ar x werkt op .a archieven, niet op .so bestanden.Waarom een `.a` gebruiken in plaats van een `.so`?
.so niet is geïnstalleerd, wat de implementatie in minimale of geïsoleerde omgevingen vereenvoudigt.Waar komt de statische `.a` terecht na het installeren van een `-dev` pakket?
/usr/lib/x86_64-linux-gnu/libfoo.a op Debian/Ubuntu, of het equivalente bibliotheekpad op andere distributies.