¿Por qué convertir SO a A?
Los desarrolladores reemplazan un .so compartido por un .a estático para producir un binario autónomo que no dependa de la presencia del .so en tiempo de ejecución - útil al desplegar en máquinas donde la biblioteca podría no estar instalada. Un .a es un archivo en formato ar de archivos objeto compilados, mientras que un .so es un ELF compartido totalmente enlazado; ambos se construyen desde la misma fuente en diferentes etapas.
Cómo convertir SO a A
ar (binutils) OPEN-SOURCE
Compile los archivos fuente a archivos objeto (gcc -c -o foo.o foo.c), luego ejecute ar rcs libfoo.a *.o para agruparlos en un archivo estático .a.
GCC / Clang OPEN-SOURCE
Ejecute ./configure --enable-static && make en el directorio fuente de la biblioteca para compilar el .a junto con o en lugar del .so.
apt / dnf / pacman FREE
Instale el paquete -dev o -static de la biblioteca (por ejemplo, apt install libfoo-dev) para obtener el .a precompilado sin compilar desde el origen; los archivos estáticos suelen ubicarse en /usr/lib/.
Acerca de estos formatos
Un archivo .so es una biblioteca de objetos compartidos en Linux y Unix, el equivalente en Linux a un .dll de Windows. Los programas lo cargan automáticamente en tiempo de ejecución; nunca…
Abrir detalles de .SO →Un archivo .a es una biblioteca estática utilizada en Unix, Linux y macOS. Es un archivo en formato ar que contiene archivos de objetos compilados que el enlazador copia en su programa al…
Abrir detalles de .A →Calidad y qué observar
- Un
.soutiliza código independiente de la posición (compilado con-fPIC); mezclar archivos objeto PIC en un.aenlazado en un ejecutable no-PIE a veces puede causar advertencias del enlazador, pero generalmente funciona. - Los números de versión en los nombres de archivo
.so(por ejemplo,libssl.so.3.0.2) no tienen equivalente en.a- las bibliotecas estáticas no llevan un SONAME. - Si solo está disponible el
.sofinalizado sin código fuente ni paquete, no existe un convertidor binario - debe obtener o compilar la biblioteca estática desde el origen.
Preguntas frecuentes
¿Puedo extraer archivos objeto de un `.so` como puedo hacerlo de un `.a`?
.so; ar x funciona en archivos .a, no en archivos .so.¿Por qué usar un `.a` en lugar de un `.so`?
.so no está instalado, lo que simplifica el despliegue en entornos mínimos o aislados.¿Dónde termina el `.a` estático después de instalar un paquete `-dev`?
/usr/lib/x86_64-linux-gnu/libfoo.a en Debian/Ubuntu, o en la ruta de biblioteca equivalente en otras distribuciones.