Por que converter SO para A?
Desenvolvedores substituem um .so compartilhado por um .a estático para produzir um binário independente que não dependa da presença do .so em tempo de execução - útil ao implantar em máquinas onde a biblioteca pode não estar instalada. Um .a é um arquivo no formato ar de arquivos de objeto compilados, enquanto um .so é um objeto compartilhado ELF totalmente vinculado; ambos são construídos a partir da mesma fonte em estágios diferentes.
Como converter SO para A
ar (binutils) OPEN-SOURCE
Compile os arquivos-fonte em arquivos de objeto (gcc -c -o foo.o foo.c) e execute ar rcs libfoo.a *.o para agrupá-los em um arquivo estático .a.
GCC / Clang OPEN-SOURCE
Execute ./configure --enable-static && make no diretório de origem da biblioteca para construir o .a junto com ou em vez do .so.
apt / dnf / pacman FREE
Instale o pacote -dev ou -static da biblioteca (ex: apt install libfoo-dev) para obter o .a pré-compilado sem compilar do código-fonte; arquivos estáticos são normalmente colocados em /usr/lib/.
Sobre estes formatos
Um arquivo .so é uma biblioteca de objetos compartilhados no Linux e Unix - o equivalente no Linux a um .dll do Windows. Os programas o carregam automaticamente durante a execução; você…
Abrir detalhes de .SO →Um arquivo .a é uma biblioteca estática usada no Unix, Linux e macOS. É um arquivo no formato ar contendo arquivos de objeto compilados que o vinculador (linker) copia para o seu programa…
Abrir detalhes de .A →Qualidade e o que observar
- Um
.sousa código independente de posição (compilado com-fPIC); misturar arquivos de objeto PIC em um.avinculado a um executável não-PIE pode, às vezes, causar avisos do vinculador, mas geralmente funciona. - Números de versão em nomes de arquivos
.so(ex:libssl.so.3.0.2) não têm equivalente em.a- bibliotecas estáticas não carregam um SONAME. - Se apenas o
.sofinalizado estiver disponível, sem código-fonte ou pacote, não existe um conversor binário - você deve obter ou compilar a biblioteca estática a partir do código-fonte.
Perguntas frequentes
Posso extrair arquivos de objeto de um `.so` como faço com um `.a`?
.so; o comando ar x funciona em arquivos .a, não em arquivos .so.Por que usar um `.a` em vez de um `.so`?
.so não está instalado, o que simplifica a implantação em ambientes mínimos ou isolados.Onde o `.a` estático vai parar após a instalação de um pacote `-dev`?
/usr/lib/x86_64-linux-gnu/libfoo.a no Debian/Ubuntu, ou no caminho de biblioteca equivalente em outras distribuições.