Pergunta

Para trás nos anos 90, quando eu comecei a sair com MFC I usado para ligar dinamicamente meus aplicativos e enviado o MFC DLLs relevante. Isso causou-me algumas questões (DLL inferno!) E eu mudei para estaticamente vincular vez - não apenas para MFC, mas para o CRT e ATL. Outros que maior arquivos EXE, estaticamente ligando nunca me causou problemas em tudo - Então, existem quaisquer desvantagens que outras pessoas se deparam? Existe uma boa razão para revisitar dinâmica ligando de novo? As minhas aplicações são principalmente STL / impulso hoje FWIW.

Foi útil?

Solução

Existem algumas desvantagens:

  • tamanho exe Bigger (esp se você enviar vários exe de)
  • Problemas usando outras DLL que dependem ou assumem ligação dinâmica (por exemplo: 3ª partido de que você não pode começar como bibliotecas estáticas DLL)
  • Diferentes c-tempos de execução entre DLL com ligação estática independente (sem cross-módulo alocar / desalocar)
  • Sem manutenção automática de componentes compartilhados (sem capacidade de ter atualização fornecedor 3º módulo partido seu código para questões de correção sem recompilar e atualizar seu aplicativo)

Nós fazemos vinculação estática para nossos aplicativos do Windows, principalmente porque ele permite a implantação xcopy, que não é apenas possível com a instalação ou depender de SxS DLL de uma forma que funciona, uma vez que o processo e mecanismo não é bem documentada ou facilmente remotable. Se você usar o DLL do local no diretório de instalação que vai um bocado de trabalho, mas não é bem suportado. A incapacidade de facilmente fazer a instalação remota sem passar por um MSI no sistema remoto é a principal razão por que não usar a vinculação dinâmica, mas (como você apontou) existem muitos outros benefícios para a vinculação estática. Há prós e contras para ambos; espero que isto ajuda a enumerá-los.

Outras dicas

A maioria das respostas que ouço sobre isso envolvem a partilha de sua DLL com outros programas, ou ter aqueles de dll ser atualizados sem a necessidade de corrigir o seu software.

Francamente eu considero aqueles a serem desvantagens, não upsides. Quando uma terceira dll partido é atualizado, ele pode mudar o suficiente para quebrar o seu software. E estes dias, espaço no disco rígido não é tão precioso como era antes, um 500k extra em seu executável? Quem se importa?

  • Sendo 100% de certeza da versão de dll que o seu software está usando é uma coisa boa.
  • Sendo 100% de certeza que o cliente não vai ter uma dependência dor de cabeça é uma coisa boa.

Os upsides superam as desvantagens na minha opinião

Enquanto você manter o seu uso limitado a certas bibliotecas e não usar qualquer dll é então você deve ser bom.

Infelizmente, existem algumas bibliotecas que você não pode ligar estaticamente. O melhor exemplo que eu tenho é OpenMP. Se você aproveitar o suporte OpenMP do Visual Studio, você terá que certificar-se o tempo de execução é instalado (neste caso vcomp.dll).

Se você fizer uso dll é, então você não pode passar alguns itens e para trás sem alguma ginástica graves. std :: cordas vêm à mente. Se o seu exe e dll estão ligadas de forma dinâmica, em seguida, a atribuição se processe de no CRT. Caso contrário, seu programa pode tentar alocar a corda de um lado e desalocar-lo por outro. coisas ruins acontecer ...

Dito isto, eu ainda estaticamente vincular minha exe de e dll. Ele faz reduzir um monte de variablilty na instalar e considero que vale a poucos limitações.

Uma característica boa de usar dll são de que se cargas múltiplas processess o mesmo dll seu código pode ser compartilhado entre eles. Isso pode salvar a memória e os tempos de carregamento encurtar para uma aplicação carregar uma DLL que já é usado por outro programa.

Não, nada de novo nessa frente. Mantê-lo dessa forma.

A maioria definitivamente.

A alocação é feita em um montão 'estática'. Desde alocação de um deallocation deve ser feito na mesma pilha, isto significa que se você enviar uma biblioteca, você deve tomar cuidado para que o código do cliente não pode chamar 'seu' p = new LibClass() e excluir esse objeto em si usando delete p;.

A minha conclusão: ou alocação escudo e desalocação de código de cliente, ou dinamicamente ligar o CRT

.

Existem algumas licenças de software, como a LGPL que exigem que você quer o uso de uma DLL ou distribuir seu aplicativo como arquivos objeto que o usuário pode ligar juntos. Se você estiver usando uma biblioteca, você provavelmente vai querer usá-lo como uma DLL.

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