Eu tenho bibliotecas Linux 2 estáticos, criado por ar cr
, libabc.a
e libxyz.a
.
Quero mesclá-los em uma biblioteca estática libaz.a
.
Como posso fazer isso.
Eu quero criar uma biblioteca estática mesclada, não dar as duas bibliotecas ao link final dos aplicativos.
linux
static-libraries
ar
osgx
fonte
fonte
libtool
solução baseada em :libtool -static -o new.a old1.a old2.a
Respostas:
Você pode extrair o objeto de ambos os
.a
arquivos e criar seu.a
arquivo usando os.o
s extraídos :fonte
libabc.a
pode conter objetos com o mesmo nome (originados de diferentes diretórios) - a remontagem não funcionará!ar -c
não funcionou para mim (Ubuntu 14.04). Eu tenhoar: no operation specified
. Eu fiz emar -qc
vez disso e funcionou bem.Existem pelo menos três maneiras de fazer isso nativamente . A primeira e mais portável maneira é usar libtool. Depois de ter construído as outras bibliotecas também com libtool, você pode combiná-las apenas adicionando as libs .la a uma variável libaz_la_LIBADD automake, ou diretamente de um Makefile com algo como:
Os outros dois estão pelo menos disponíveis ao usar o GNU ar. Você pode usar um script de MRI (denominado, por exemplo, libaz.mri), como:
e, em seguida, execute ar como:
Ou você pode usar um arquivo fino (opção
-T
), que permitirá adicionar outros arquivos sem colocá-los aninhados dentro, embora a desvantagem seja que se você quiser distribuir a biblioteca estática, o objeto separado ficará ausente:Todos os métodos acima lidam perfeitamente com nomes de membros sobrepostos dos arquivos originais.
Caso contrário, você teria que desempacotar em diretórios diferentes e empacotar novamente, para evitar a substituição de nomes de membros sobrepostos:
fonte
ar cqT libaz.a libabc.a libxyz.a && echo -e 'create libaz.a\naddlib libaz.a\nsave\nend' | ar -M
. Isso cria um thin temporáriolibaz.a
e, em seguida, converte o arquivo thin em um normal (para que você possa movê-lo / distribuí-lo). Isso também funciona perfeitamente quando os nomes de sua biblioteca têm caracteres especiais (espaçados, sinais de mais ou vírgulas) (ou sejaar cqT libbundle.a libfoo++.a 'libbar baz.a'
). Mas 1 de mim!libtool
, recebo estes erros:libtool: link: unable to infer tagged configuration libtool: error: specify a tag with '--tag'
Alguma ideia de como consertar isso?--Wl,-whole-archive
opção for exigida no comando de vinculação original para vários lib * .a, e eu precisar combinar todos os lib * .a emone.a
. Ao vincular novamente,--Wl,-whole-archive
não funcionará comone.a
. Qual é a sua sugestão? stackoverflow.com/questions/56323197/…Se você simplesmente fizer isso:
você perderá alguns arquivos de objeto se houver membros com o mesmo nome em aa e ba, portanto, você precisa extrair membros de arquivos diferentes para pastas diferentes:
além disso, é possível que haja vários membros com o mesmo nome em um arquivo (digamos em aa), se você executar ar x aa , obterá apenas um para aqueles membros com o 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':
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:
assim, o vinculador tratará de tudo para você!
fonte
-fPIC
.Melhor ainda, você executa a vinculação parcial em cada biblioteca e eles fazem um arquivo dos dois arquivos objeto resultantes. Dessa forma, ele funciona como bibliotecas compartilhadas
Você faz ligação parcial com
então, em vez de fazer o arquivo intermediário ou depois de extraí-lo, execute
então
fonte
agora você tem duas versões do "macroblock-10.o"
fonte
Aqui, você cria o arquivo de arquivos e, em seguida, 'aplaina' (dilui) o resultado com a bandeira T. Não tenho certeza de como funcionará com o mesmo nome de arquivos .o que podem estar contidos nele.
fonte