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.

Foi útil?

Solução

Você pode extrair o objeto de ambos .a arquivos e crie seu .a arquivo usando o extraído .os:

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"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top