Varför konvertera SO till A?
Utvecklare ersätter en delad .so med en statisk .a för att skapa en fristående binärfil som inte är beroende av att .so-filen finns tillgänglig vid körning - användbart vid distribution till maskiner där biblioteket kanske inte är installerat. En .a är ett arkiv i ar-format med kompilerade objektfiler, medan en .so är ett fullständigt länkat ELF-delat objekt; båda byggs från samma källkod vid olika stadier.
Hur man konverterar SO till A
ar (binutils) OPEN-SOURCE
Kompilera källfiler till objektfiler (gcc -c -o foo.o foo.c), och kör sedan ar rcs libfoo.a *.o för att paketera dem i ett statiskt .a-arkiv.
GCC / Clang OPEN-SOURCE
Kör ./configure --enable-static && make i bibliotekets källkodsmapp för att bygga .a tillsammans med eller istället för .so.
apt / dnf / pacman FREE
Installera bibliotekets -dev- eller -static-paket (t.ex. apt install libfoo-dev) för att få den förbyggda .a-filen utan att bygga från källkod; statiska arkiv placeras vanligtvis i /usr/lib/.
Om dessa format
En .so-fil är ett delat objektbibliotek på Linux och Unix - Linux-motsvarigheten till en Windows .dll. Program laddar den automatiskt vid körning; du öppnar den aldrig direkt. Om en app…
Öppna detaljer för .SO →En .a-fil är ett statiskt bibliotek som används på Unix, Linux och macOS. Det är ett arkiv i ar-format bestående av kompilerade objektfiler som länkaren kopierar in i ditt program vid…
Öppna detaljer för .A →Kvalitet & vad man bör tänka på
- En
.soanvänder positionsoberoende kod (kompilerad med-fPIC); att blanda PIC-objektfiler i en.asom länkas in i en icke-PIE-exekverbar fil kan ibland orsaka länkningsvarningar men fungerar vanligtvis. - Versionsnummer i
.so-filnamn (t.ex.libssl.so.3.0.2) har ingen motsvarighet i.a- statiska bibliotek bär inte på ett SONAME. - Om endast den färdiga
.so-filen är tillgänglig utan källkod eller paket finns det ingen binärkonverterare - du måste skaffa eller bygga det statiska biblioteket från källkod.
Vanliga frågor
Kan jag extrahera objektfiler från en `.so` på samma sätt som från en `.a`?
.so; ar x fungerar på .a-arkiv, inte på .so-filer.Varför använda en `.a` istället för en `.so`?
.so-filen inte är installerad, vilket förenklar distribution till minimala eller isolerade miljöer.Var hamnar den statiska `.a`-filen efter installation av ett `-dev`-paket?
/usr/lib/x86_64-linux-gnu/libfoo.a på Debian/Ubuntu, eller motsvarande bibliotekssökväg på andra distributioner.