Pergunta

Estou cansado de adicionar dez bibliotecas de links ao meu projeto ou de exigir oito delas para usar as minhas.Gostaria de pegar bibliotecas existentes como libpng.a, libz.a, libjpeg.a e combiná-las em uma única biblioteca .a.Isso é possível?Que tal combinar bibliotecas .lib?

Foi útil?

Solução

Em sistemas do tipo Unix, os utilitários ld e ar podem fazer isso.Confira http://en.wikipedia.org/wiki/Ar_(Unix) ou procure as páginas de manual em qualquer caixa Linux ou através do Google, por exemplo, 'unix man ar'.

Observe que talvez seja melhor vincular a uma biblioteca compartilhada (dinâmica).Isso adicionaria uma dependência ao seu executável, mas reduziria drasticamente seu tamanho, especialmente se você estiver escrevendo um aplicativo gráfico.

Outras dicas

Você poderia extrair os arquivos objeto de cada biblioteca com

ar x <library name>

e depois mescle todos eles em uma nova biblioteca com

ar cs <new library name> <list each extracted object file>

No Linux ou MinGW ou Cygwin, com conjunto de ferramentas GNU:

ar -M <<EOM
    CREATE libab.a
    ADDLIB liba.a
    ADDLIB libb.a
    SAVE
    END
EOM
ranlib libab.a

Ou se você puder manter a existência de liba.a e libb.a:

ar crsT libab.a liba.a libb.a

No Windows, com conjunto de ferramentas MSVC:

lib.exe /OUT:libab.lib liba.lib libb.lib

Talvez eu esteja entendendo mal, mas você não precisa enviar as bibliotecas apenas se o código do usuário final as chamar diretamente?Se todo o acesso aos métodos Jpeg etc. for do seu código na sua biblioteca estática, basta vincular as bibliotecas à sua biblioteca.

Ou seja

----------------
| End-user exe |
----------------
      |
      | makes calls to
      |
      v
 --------------------
 | Your static lib.a | 
 --------------------
         | makes calls to and links
         v
     ------------------------------------ .....
     |                    |         |
  -------------    -------- ---------- 
  | libjpeg.a |    |libz.a| |libpng.a|
  -------------    -------- ----------

Ou seja, é apenas um problema se o código final precisar fazer chamadas diretas para libz.a, libpng.a etc.

Se o código do aplicativo tiver uma necessidade legítima de chamar libz.a, por exemplo, então, conforme mencionado acima, seria um caso para usar um módulo dinâmico.

PS:Eu recebo um distintivo de artista?:)

Não tenho certeza de como combiná-los fisicamente em um único arquivo, no entanto, você pode empregar uma espécie de abstração e incluir apenas um único "AllMyLibs.a/h" que, por sua vez, inclui tudo o que você deseja.Você também pode colocar isso no local onde seu compilador procura bibliotecas, para que funcione em qualquer projeto.

P.S.- Por curiosidade, por que você não gosta de incluir single libs?

Combinar várias bibliotecas de terceiros em uma só pode criar mais problemas para você - por exemplo, se duas dessas bibliotecas definirem um símbolo comum que seu programa não usa.Agora você precisa extrair todas (ou todas menos uma) as instâncias do símbolo comum antes de combinar as bibliotecas.

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