Como mesclar duas bibliotecas estáticas “ar” em uma

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ê!