Зачем конвертировать SO в A?
Разработчики заменяют общую библиотеку .so на статическую .a, чтобы создать автономный исполняемый файл, который не зависит от наличия .so во время выполнения - это полезно при развертывании на машинах, где библиотека может быть не установлена. .a - это архив формата ar из скомпилированных объектных файлов, в то время как .so - это полностью скомпонованный разделяемый объект ELF; оба создаются из одного и того же исходного кода на разных этапах.
Способы конвертации SO в A
ar (binutils) OPEN-SOURCE
Скомпилируйте исходные файлы в объектные файлы (gcc -c -o foo.o foo.c), затем запустите ar rcs libfoo.a *.o, чтобы объединить их в статический архив .a.
GCC / Clang OPEN-SOURCE
Запустите ./configure --enable-static && make в директории с исходным кодом библиотеки, чтобы собрать .a вместе с .so или вместо него.
apt / dnf / pacman FREE
Установите пакет -dev или -static для библиотеки (например, apt install libfoo-dev), чтобы получить готовый .a без сборки из исходников; статические архивы обычно размещаются в /usr/lib/.
Об этих форматах
Файл .so - это разделяемая библиотека (shared object) в Linux и Unix, эквивалент Windows .dll. Программы загружают её автоматически во время выполнения; вы никогда не открываете её…
Открыть детали .SO →Файл .a - это статическая библиотека, используемая в Unix, Linux и macOS. Это архив формата ar, содержащий скомпилированные объектные файлы, которые компоновщик копирует в вашу программу во…
Открыть детали .A →Качество и на что обратить внимание
- Файлы
.soиспользуют позиционно-независимый код (скомпилированный с-fPIC); смешивание объектных файлов PIC в архиве.a, скомпонованном в исполняемый файл без PIE, иногда может вызывать предупреждения компоновщика, но обычно работает. - Номера версий в именах файлов
.so(например,libssl.so.3.0.2) не имеют эквивалента в.a- статические библиотеки не содержат SONAME. - Если доступен только готовый файл
.soбез исходного кода или пакета, бинарного конвертера не существует - вы должны получить или собрать статическую библиотеку из исходников.
Часто задаваемые вопросы
Могу ли я извлечь объектные файлы из `.so`, как из `.a`?
.so; команда ar x работает с архивами .a, но не с файлами .so.Зачем использовать `.a` вместо `.so`?
.so не установлена, что упрощает развертывание в минималистичных или изолированных средах.Где оказывается статический файл `.a` после установки пакета `-dev`?
/usr/lib/x86_64-linux-gnu/libfoo.a в Debian/Ubuntu или по аналогичному пути к библиотекам в других дистрибутивах.