Eu tenho um pequeno pedaço de código que depende de muitas bibliotecas estáticas (a_1-a_n). Gostaria de empacotar esse código em uma biblioteca estática e disponibilizá-lo para outras pessoas.
Minha biblioteca estática, vamos chamá-lo de X, compila bem.
Criei um programa de amostra simples que usa uma função do X, mas quando tento vinculá-lo ao X, recebo muitos erros sobre a falta de símbolos nas bibliotecas a_1 - a_n.
Existe uma maneira de criar uma nova biblioteca estática, Y que contém X e toda a funcionalidade necessária para X (bits selecionados de a_1 - a_n), para que eu possa distribuir apenas Y para as pessoas vincularem seus programas?
ATUALIZAR:
Eu olhei apenas para despejar tudo com ar e criar uma mega-lib, no entanto, que acaba incluindo muitos símbolos que não são necessários (todos os arquivos .o têm cerca de 700 MB, no entanto, um executável vinculado estaticamente é 7). MB). Existe uma boa maneira de incluir apenas o que é realmente necessário?
Isso parece relacionado a Como combinar várias bibliotecas C / C ++ em uma? .
-r
com a qual a saída pode ser usada como uma entrada para ld. Se você vincular uma vez que você deve obter um reposicionável, pode substituir suas bibliotecas. (tentei thogh).Se você estiver usando o Visual Studio, sim, você pode fazer isso.
A ferramenta de criação de bibliotecas que acompanha o Visual Studio permite associar bibliotecas na linha de comando. Eu não conheço nenhuma maneira de fazer isso no editor visual.
fonte
No Linux ou MingW, com a cadeia de ferramentas GNU:
Se você não excluir
liba.a
elibb.a
, poderá criar um "arquivo fino":No Windows, com a cadeia de ferramentas MSVC:
fonte
ar crsT
, que faz algo como "ligação simbólica" em vez de copiar, então você só precisa enviar uma cópia dos dados.Uma biblioteca estática é apenas um arquivo morto de arquivos de
.o
objetos. Extraia-os comar
(assumindo o Unix) e empacote-os novamente em uma grande biblioteca.fonte
Como alternativa às
Link Library Dependencies
propriedades do projeto, há outra maneira de vincular bibliotecas no Visual Studio.Add Existing Item...
).Item Type
seLibrary
Isso incluirá as outras bibliotecas no X como se você executasse
fonte
Observe antes de ler o restante: O script de shell mostrado aqui certamente não é seguro e bem testado. Use por sua conta e risco!
Eu escrevi um script bash para realizar essa tarefa. Suponha que sua biblioteca seja lib1 e que você precise incluir alguns símbolos é lib2. O script agora roda em um loop, onde primeiro verifica quais símbolos indefinidos da lib1 podem ser encontrados na lib2. Em seguida, extrai os arquivos de objeto correspondentes da lib2 com
ar
, renomeia-os um pouco e os coloca na lib1. Agora pode haver mais símbolos ausentes, porque as coisas que você incluiu na lib2 precisam de outras coisas da lib2, que ainda não incluímos, portanto o loop precisa ser executado novamente. Se após algumas passagens do loop não houver mais alterações, ou seja, nenhum arquivo de objeto da lib2 adicionado à lib1, o loop poderá parar.Observe que os símbolos incluídos ainda são relatados como indefinidos
nm
, por isso estou acompanhando os arquivos de objetos que foram adicionados à lib1, eles mesmos, para determinar se o loop pode ser interrompido.Eu nomeei esse script
libcomp
, para que você possa chamá-lo, por exemplo, comonde libwhatever é de onde você deseja incluir símbolos. No entanto, acho mais seguro copiar tudo para um diretório separado primeiro. Eu não confiava tanto no meu script (no entanto, funcionou para mim; eu poderia incluir a libgsl.a na minha biblioteca de números com isso e deixar de fora essa opção do compilador -lgsl).
fonte