Eu tenho 2 bibliotecas linux estáticas, criadas por ar cr
, libabc.a
e libxyz.a
.
Eu quero mesclar-los em uma biblioteca estática libaz.a
.
Como posso fazer isso.
Eu quero criar uma biblioteca estática mesclada, não para dar as duas bibliotecas para o link final de aplicativos
Você pode extrair o object de ambos os arquivos .a
e criar seu arquivo .a
usando os .o
s extraídos:
ar -x libabc.a ar -x libxyz.a ar -c libaz.a *.o
Existem pelo menos três maneiras de fazer isso nativamente . A primeira e mais portável maneira é usar o libtool. Depois de ter construído as outras bibliotecas também com o libtool, você pode combiná-las apenas adicionando as bibliotecas .la a uma variável automake libaz_la_LIBADD, 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 MRI (chamado por exemplo libaz.mri), como:
create libaz.a addlib libabc.a addlib libxyz.a save end
e então execute ar como:
ar -M
Ou você pode usar um arquivo thin (opção -T
), que permitirá adicionar outros arquivos sem colocá-los dentro, embora a desvantagem seja que, se você quiser distribuir a biblioteca estática, o object desconectado estará ausente:
ar -rcT libaz.a libabc.a libxyz.a
Todos os methods acima manipulam graciosamente nomes de membros sobrepostos dos arquivos originais.
Caso contrário, você teria que descompactar em diretórios diferentes e empacotar 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 fizer isso como:
ar x aa ar x ba ar c ca *.o
você perderá alguns arquivos de objects se houver membros com o mesmo nome tanto em aa quanto em ba, então você precisa extrair membros de diferentes arquivos em pastas diferentes:
ar x aa && mv *.o a_objs ar x ba && mv *.o b_objs ar c ca a_objs/*.o b_objs/*.o
mais ainda, é possível que existam vários membros de mesmo nome em um arquivo (digamos em aa), se você executar ar x aa , você obterá apenas um para os membros de mesmo nome.
A única maneira de extrair todos os membros do mesmo nome em um arquivo é especificar o número do membro pela opção ‘N’:
ar xN 1 aa xxx.co && mv xxx.co xxx.c.1.o ar xN 2 ba xxx.co && mv xxx.co xxx.c.2.o ...
Isso seria um trabalho tedioso, então você terá que escrever um script mais sofisticado para fazer esse trabalho.
Uma solução opcional é que você pode combinar vários arquivos em uma biblioteca compartilhada:
g++ -shared -o c.so -Wl,--whole-archive aa ba
Desta forma, o linker irá lidar com todas as coisas para você!