Pergunta

Vou iniciar um novo projeto C ++ que dependerá de uma série de bibliotecas, incluindo parte das bibliotecas do Boost, o Log4CXX ou a Biblioteca de log do Google - e à medida que o projeto evolui outros (que ainda não posso antecipar) .

Ele terá que funcionar em sistemas de 32 e 64 bits, provavelmente em um ambiente Linux bastante diversificado, onde não espero ter todas as bibliotecas necessárias disponíveis nem privilégios SU.

Minha pergunta é: devo construir meu aplicativo com vinculação dinâmica ou estaticamente a todas essas bibliotecas?

Notas:

(1) Estou ciente de que a ligação estática pode ser uma dor durante o desenvolvimento (tempos de compilação mais longos, compilando cruzamentos por 32 e 64 bits, descendo cadeias de dependência para incluir todas as bibliotecas, etc.), mas é muito mais fácil durante o teste - Basta mover o arquivo e executar.

(2) Por outro lado, as costuras de ligação dinâmica mais fáceis durante a fase de desenvolvimento - tempos de compilação curtos (realmente não sabem como lidar com a ligação dinâmica a bibliotecas de 64 bits do meu ambiente de dev 32 bits), sem agitação com cadeias de dependência. A implantação de novas versões, por outro lado, pode ser feia - especialmente quando novas bibliotecas são necessárias (veja a condição acima de não ter direitos de SU nas máquinas direcionadas, nem nas bibliotecas disponíveis).

(3) Eu li as perguntas relacionadas sobre esse tópico, mas não consegui descobrir qual abordagem se encaixaria melhor no meu cenário.

Conclusões:

  1. Obrigado a todos pela sua opinião!
  2. Provavelmente irei com uma ligação estática porque:
    • Implantação mais fácil
    • Desempenho previsível e resultados mais consistentes durante o perf. Teste (veja este artigo: http://www.inf.usi.ch/faculty/hauswirth/publications/cu-cs-1042-08.pdf)
    • Como apontado, o tamanho e a duração da compilação da estática vs. dinâmica não parecem ser uma diferença tão grande
    • Ciclos de teste mais fáceis e rápidos
    • Eu posso manter todo o dev. Ciclo no meu dev. máquina
Foi útil?

Solução

A ligação estática tem uma má reputação. Atualmente, temos discos rígidos enormes e tubos extraordinariamente gordos. Muitos dos argumentos antigos a favor da ligação dinâmica são muito menos importantes agora.

Além disso, há um motivo realmente bom para preferir a ligação estática ao Linux: a infinidade de configurações de plataforma por aí torna quase impossível garantir que seu executável funcione até uma pequena fração deles sem vincular estática.

Eu suspeito que isso não será uma opinião popular. Multar. Mas tenho 11 anos de experiência implantando aplicativos no Linux e, até que algo como o LSB realmente decola e realmente estende seu alcance, o Linux continuará sendo muito mais difícil de implantar aplicativos. Até então, vincule estaticamente seu aplicativo, se você precisar ser encontrado em uma ampla gama de plataformas.

Outras dicas

Eu provavelmente usaria a ligação dinâmica durante (a maior parte do) desenvolvimento e depois mudaria para a ligação estática para as fases finais do desenvolvimento e (toda) implantação. Felizmente, há pouca necessidade de testes extras ao mudar da ligação dinâmica para estática das bibliotecas.

Este é outro voto para a ligação estática. Não notei tempos de vinculação significativamente mais longos para a aplicação. O aplicativo em questão é um aplicativo de console de linha de ~ 50k, com várias bibliotecas compiladas para um monte de máquinas comuns, principalmente supercomputadores com 100 a 10.000 núcleos. Com a ligação estática, você sabe exatamente quais bibliotecas você vai usar, pode facilmente testar novas versões delas.

Em geral, é assim que a maioria dos aplicativos Mac é construída. É o que permite que a instalação seja simplesmente copiar um diretório para o sistema.

O melhor é deixar isso para o empacotador e fornecer as duas opções nos scripts de configuração/fabricação. Geralmente, a ligação dinâmica teria a preferência desde então, seria fácil atualizar as bibliotecas quando necessário, ou seja, quando as vulnerabilidades de segurança etc. são descobertas.

Observe que, se você não tiver privilégios root para instalar as bibliotecas nos diretórios do sistema, poderá compilar o programa para que ele procure primeiro em outro lugar para as bibliotecas dinâmicas necessárias, isso é realizado definindo a diretiva RunPath em binários de elfos. Você pode especificar esse diretório com a opção -rpath do Linker LD.

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