Dlaczego konwertować SO na A?
Programiści zastępują współdzielone pliki .so statycznymi plikami .a, aby stworzyć samodzielny plik binarny, który nie wymaga obecności .so w czasie wykonywania - jest to przydatne przy wdrażaniu na maszynach, gdzie biblioteka może nie być zainstalowana. Plik .a to archiwum formatu ar zawierające skompilowane pliki obiektowe, podczas gdy .so to w pełni skonsolidowany obiekt współdzielony ELF; oba są budowane z tych samych źródeł na różnych etapach.
Jak przekonwertować SO na A
ar (binutils) OPEN-SOURCE
Skompiluj pliki źródłowe do plików obiektowych (gcc -c -o foo.o foo.c), a następnie uruchom ar rcs libfoo.a *.o, aby połączyć je w statyczne archiwum .a.
GCC / Clang OPEN-SOURCE
Uruchom ./configure --enable-static && make w katalogu źródłowym biblioteki, aby zbudować .a obok lub zamiast .so.
apt / dnf / pacman FREE
Zainstaluj pakiet -dev lub -static danej biblioteki (np. apt install libfoo-dev), aby otrzymać gotowy plik .a bez budowania ze źródeł; archiwa statyczne są zazwyczaj umieszczane w /usr/lib/.
O tych formatach
Plik .so to biblioteka współdzielona (shared object) w systemach Linux i Unix - odpowiednik plików .dll w systemie Windows. Programy ładują go automatycznie podczas uruchamiania; nigdy nie…
Otwórz szczegóły .SO →Plik .a to biblioteka statyczna używana w systemach Unix, Linux i macOS. Jest to archiwum w formacie ar zawierające skompilowane pliki obiektowe, które linker kopiuje do programu w czasie…
Otwórz szczegóły .A →Jakość i na co uważać
- Plik
.soużywa kodu niezależnego od pozycji (skompilowanego z-fPIC); mieszanie plików obiektowych PIC wewnątrz.akonsolidowanego z plikiem wykonywalnym non-PIE może czasem powodować ostrzeżenia konsolidatora, ale zazwyczaj działa. - Numery wersji w nazwach plików
.so(np.libssl.so.3.0.2) nie mają odpowiednika w.a- biblioteki statyczne nie posiadają SONAME. - Jeśli dostępny jest tylko gotowy plik
.sobez źródeł lub pakietu, nie istnieje konwerter binarny - musisz pozyskać lub zbudować bibliotekę statyczną ze źródeł.
Najczęściej zadawane pytania
Czy mogę wyodrębnić pliki obiektowe z `.so` tak jak z `.a`?
.so; ar x działa na archiwach .a, a nie na plikach .so.Dlaczego warto używać `.a` zamiast `.so`?
.so nie jest zainstalowany, co upraszcza wdrażanie w minimalnych lub izolowanych środowiskach.Gdzie trafia statyczny plik `.a` po zainstalowaniu pakietu `-dev`?
/usr/lib/x86_64-linux-gnu/libfoo.a w systemie Debian/Ubuntu lub do odpowiedniej ścieżki bibliotek w innych dystrybucjach.