Como mesclar duas bibliotecas estáticas "AR" em uma?
-
26-09-2019 - |
Pergunta
Eu tenho 2 bibliotecas linux estáticas, criadas por ar cr
, libabc.a
e libxyz.a
.
Eu quero mesclá -los em uma biblioteca estática libaz.a
.
Como posso fazer isso.
Quero criar uma biblioteca estática mesclada, para não fornecer as duas bibliotecas ao link final dos aplicativos.
Solução
Você pode extrair o objeto de ambos .a
arquivos e crie seu .a
arquivo usando o extraído .o
s:
ar -x libabc.a
ar -x libxyz.a
ar -c libaz.a *.o
Outras dicas
Existem pelo menos três maneiras de fazer isso nativamente. A primeira e mais portátil maneira é usar o LBtool. Depois de ter construído as outras bibliotecas também com o Libtool, você pode combiná -las apenas adicionando a .LA LIBS a uma variável Libaz_LA_Libadd Autorake, ou diretamente de um Makefile com algo como:
libtool --mode=link cc -static -o libaz.la libabc.la libxyz.la
Os outros dois estão pelo menos disponíveis ao usar o GNU AR. Você pode usar um script de ressonância magnética (nomeado por exemplo libaz.mri), como:
create libaz.a
addlib libabc.a
addlib libxyz.a
save
end
e depois execute AR como:
ar -M <libaz.mri
Ou você pode usar um fino Arquivo (opção -T
), que permitirá adicionar outros arquivos sem aninhados dentro, embora a desvantagem seja que, se você quiser distribuir a biblioteca estática, o objeto destacado estará faltando:
ar -rcT libaz.a libabc.a libxyz.a
Todos os métodos acima lidam graciosamente nomes de membros sobrepostos dos arquivos originais.
Caso contrário, você teria que desempacotar diretórios diferentes e reembalar novamente, para evitar a substituição de nomes de membros sobrepostos:
mkdir abc; cd abc; ar -x ../libabc.a
mkdir xyz; cd xyz; ar -x ../libxyz.a
ar -qc libaz.a abc xyz
Se você simplesmente faz isso como:
ar x a.a
ar x b.a
ar c c.a *.o
Você perderá alguns arquivos de objeto se houver membros com o mesmo nome em AA e BA, então, você precisará extrair membros de diferentes arquivos para uma pasta diferente:
ar x a.a && mv *.o a_objs
ar x b.a && mv *.o b_objs
ar c c.a a_objs/*.o b_objs/*.o
Além disso, é possível que haja vários membros do mesmo nome em um arquivo (digamos em AA), se você correr ar x aa, você receberá apenas um para os membros do mesmo nome.
A única maneira de extrair todos os membros do mesmo nome em um arquivo é especificar o número do membro por opção 'n':
ar xN 1 a.a xxx.c.o && mv xxx.c.o xxx.c.1.o
ar xN 2 b.a xxx.c.o && mv xxx.c.o xxx.c.2.o
...
Isso seria um trabalho tedioso, então você terá que escrever um script mais sofisticado para fazer esse trabalho.
Um opcional Solutions é que você pode combinar vários arquivos em uma biblioteca compartilhada:
g++ -shared -o c.so -Wl,--whole-archive a.a b.a
Dessa forma, o vinculador lidará com todas as coisas para você!
Melhor ainda, você executa vinculação parcial em cada biblioteca e eles fazem um arquivo dos dois arquivos de objeto resultantes. Dessa forma, opera como bibliotecas compartilhadas
Você faz uma ligação parcial com
gcc -r --nostdlib
Então, em vez de fazer o arquivo intermediário ou depois de reextrair, execute
gcc -r --nostdlib $CFLAGS $OBJECTS_A -o $LIBNAME_A.o
gcc -r --nostdlib $CFLAGS $OBJECTS_B -o $LIBNAME_B.o
então
ar -cr $LIBNAME_JOINED.a $LIBNAME_A.o $LIBNAME_B.o
ar -x libx264.a
mkdir sub && cd sub
ar -m ../libx264.a `ar -t ../libx264.a |sort|uniq|grep "\.o"`
ar -x ../libx264.a
Agora você tem duas versão de "macroblock-10.o"