Hvorfor konvertere SO til A?
Utviklere erstatter en delt .so med en statisk .a for å produsere en selvstendig binærfil som ikke er avhengig av at .so-filen er til stede ved kjøretid - nyttig ved distribusjon til maskiner der biblioteket kanskje ikke er installert. En .a er et arkiv i ar-format av kompilerte objektfiler, mens en .so er et fullstendig lenket ELF-delt objekt; begge er bygget fra samme kilde på ulike stadier.
Hvordan konvertere SO til A
ar (binutils) OPEN-SOURCE
Kompiler kildefiler til objektfiler (gcc -c -o foo.o foo.c), og kjør deretter ar rcs libfoo.a *.o for å bunte dem inn i et statisk .a-arkiv.
GCC / Clang OPEN-SOURCE
Kjør ./configure --enable-static && make i bibliotekets kildemappe for å bygge .a-filen ved siden av eller i stedet for .so-filen.
apt / dnf / pacman FREE
Installer bibliotekets -dev- eller -static-pakke (f.eks. apt install libfoo-dev) for å få den ferdigbygde .a-filen uten å bygge fra kildekode; statiske arkiver plasseres vanligvis i /usr/lib/.
Om disse formatene
En .so-fil er et delt objektbibliotek på Linux og Unix - Linux-ekvivalenten til en Windows .dll. Programmer laster den automatisk ved kjøretid; du åpner den aldri direkte. Hvis en app…
Åpne .SO-detaljer →En .a-fil er et statisk bibliotek som brukes på Unix, Linux og macOS. Det er et arkiv i ar-format som inneholder kompilerte objektfiler som linkeren kopierer inn i programmet ditt ved…
Åpne .A-detaljer →Kvalitet og hva du bør passe på
- En
.sobruker posisjonsuavhengig kode (kompilert med-fPIC); blanding av PIC-objektfiler inn i en.asom lenkes inn i en ikke-PIE kjørbar fil kan noen ganger føre til lenker-advarsler, men fungerer vanligvis. - Versjonsnumre i
.so-filnavn (f.eks.libssl.so.3.0.2) har ingen ekvivalent i.a- statiske biblioteker bærer ikke et SONAME. - Hvis bare den ferdige
.so-filen er tilgjengelig uten kildekode eller pakke, finnes det ingen binærkonverterer - du må skaffe eller bygge det statiske biblioteket fra kildekode.
Ofte stilte spørsmål
Kan jeg trekke ut objektfiler fra en `.so` slik jeg kan fra en `.a`?
.so-lenking; ar x fungerer på .a-arkiver, ikke på .so-filer.Hvorfor bruke en `.a` i stedet for en `.so`?
.so-filen ikke er installert, noe som forenkler distribusjon til minimale eller isolerte miljøer.Hvor havner den statiske `.a`-filen etter installasjon av en `-dev`-pakke?
/usr/lib/x86_64-linux-gnu/libfoo.a på Debian/Ubuntu, eller tilsvarende biblioteksti på andre distribusjoner.