Hvorfor konvertere SO til A?
Udviklere erstatter en delt .so med en statisk .a for at producere en selvstændig binær fil, der ikke afhænger af, at .so-filen er til stede ved kørsel - nyttigt ved udrulning til maskiner, hvor biblioteket måske ikke er installeret. En .a er et arkiv i ar-format bestående af kompilerede objektfiler, mens en .so er et fuldt linket ELF shared object; begge er bygget fra samme kilde på forskellige stadier.
Sådan konverterer du SO til A
ar (binutils) OPEN-SOURCE
Kompiler kildefiler til objektfiler (gcc -c -o foo.o foo.c), og kør derefter ar rcs libfoo.a *.o for at samle dem i et statisk .a arkiv.
GCC / Clang OPEN-SOURCE
Kør ./configure --enable-static && make i bibliotekets kildemappe for at bygge .a sammen med eller i stedet for .so.
apt / dnf / pacman FREE
Installer bibliotekets -dev eller -static pakke (f.eks. apt install libfoo-dev) for at få den præbyggede .a uden at bygge fra kilden; statiske arkiver placeres typisk i /usr/lib/.
Om disse formater
En .so-fil er et delt objektbibliotek på Linux og Unix - Linux-modstykket til en Windows .dll. Programmer indlæser den automatisk ved kørsel; du åbner den aldrig direkte. Hvis en app fejler…
Åbn .SO detaljer →En .a-fil er et statisk bibliotek, der bruges på Unix, Linux og macOS. Det er et arkiv i ar-format bestående af kompilerede objektfiler, som linkeren kopierer ind i dit program under…
Åbn .A detaljer →Kvalitet & hvad man skal være opmærksom på
- En
.sobruger positionsuafhængig kode (kompileret med-fPIC); blanding af PIC-objektfiler i en.a, der linkes ind i en ikke-PIE eksekverbar fil, kan nogle gange forårsage linker-advarsler, men fungerer normalt. - Versionsnumre i
.so-filnavne (f.eks.libssl.so.3.0.2) har ingen ækvivalent i.a- statiske biblioteker bærer ikke et SONAME. - Hvis kun den færdige
.soer tilgængelig uden kildekode eller pakke, findes der ingen binær konverter - du skal anskaffe eller bygge det statiske bibliotek fra kilden.
Ofte stillede spørgsmål
Kan jeg udpakke objektfiler fra en `.so`, ligesom jeg kan fra en `.a`?
.so-linkning; ar x fungerer på .a-arkiver, ikke på .so-filer.Hvorfor bruge en `.a` i stedet for en `.so`?
.so-filen ikke er installeret, hvilket forenkler udrulning til minimale eller isolerede miljøer.Hvor ender den statiske `.a` efter installation af en `-dev`-pakke?
/usr/lib/x86_64-linux-gnu/libfoo.a på Debian/Ubuntu, eller den tilsvarende bibliotekssti på andre distributioner.