Devo ligar para o tempo de execução Visual Studio C estaticamente ou dinamicamente?

StackOverflow https://stackoverflow.com/questions/787216

  •  16-09-2019
  •  | 
  •  

Pergunta

Eu li argumentos de ambos os lados sobre se deve-se ligar para a biblioteca C runtime estática ou dinâmica em projetos do Visual Studio, e eu ainda não estou inteiramente certo o que pensar.

As minhas puxa projeto em algumas bibliotecas de terceiros (Python, HDF5, Trilinos e Microsoft MPI), cada um dos quais tem de ser construída com a mesma biblioteca de tempo de execução como meu executável final (caso contrário, eles não podem ser ligados entre si). Quando ligando estaticamente, cada uma destas bibliotecas irá conter uma cópia do tempo de execução C. Eu li que este é susceptível de questões causa porque o executável final irá conter várias cópias do tempo de execução, nenhum dos quais podem interagir uns com os outros. Mas não seria o vinculador reclamar se os mesmos símbolos foram multiplicar definido?

Eu gostaria de evitar "DLL Hell", mas estou preocupado com erros insidiosas que podem surgir com estaticamente ligando em várias cópias do tempo de execução. Am I coisas leitura errada?

Além disso, estou usando o Visual Studio 2005 e eu li que o Service Pack 1 tempo de execução não é compatível com versões anteriores. Isso significa que um aplicativo construído sem SP1 não será executado em uma máquina que tem as DLLs SP1, mesmo que tenham o mesmo nome (por exemplo msvcr80.dll)?

Foi útil?

Solução

A ligação estaticamente vai inchar todos os seus EXEs e DLLs, e pode causar falhas (por exemplo., Se o código em uma DLL chama free () com um ponteiro alocado pelo malloc () em uma DLL diferente).

Você pode obter o melhor dos dois mundos, ligando de forma dinâmica e implantar as DLLs de tempo de execução como os conjuntos privados. Isto significa simplesmente colocando uma cópia de um diretório especialmente nomeado contendo as DLLs de tempo de execução e seus manifestos ao lado de seu executável.

Veja a seção "Implantando Visual C ++ DLLs de biblioteca como conjuntos privados" no http://msdn.microsoft.com/en-us/library/ms235291 (VS.80) .aspx para detalhes, mas basicamente sua aplicação esta aparência:

c:\Program Files\My App\MyApp.exe
c:\Program Files\My App\MyLibrary.dll
c:\Program Files\My App\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest
c:\Program Files\My App\Microsoft.VC80.CRT\msvcr80.dll

Quanto à sua última pergunta, sim, a máquina de destino precisa as versões corretas das DLLs de tempo de execução para o trabalho, mas por implantá-los como conjuntos privados, você garante isso.

Outra vantagem é que os usuários não-administrador pode instalar seu aplicativo (e não em Arquivos de Programas, mas em outros lugares.) - eles não precisam de permissão para arquivos de gravação na área de WinSxS

Outras dicas

A única vez que você vai ter várias cópias do tempo de execução é quando você estaticamente vincular uma biblioteca em um DLL - cada DLL receberá uma cópia, e assim que o exe. Se eles são todas bibliotecas estáticas e não DLLs, todos eles ligação juntos e todas as suas bibliotecas irão compartilhar o mesmo tempo de execução.

Esse é o trabalho do vinculador.

... Fazê-lo estaticamente ... tentativas para corrigir DLL Hell não funcionou tão bem ... basta adicionar um 200k extra para sua instalação com a vinculação estática.

estático bibliotecas necessidade NÃO FAZEM a ser estaticamente ligada a outras bibliotecas estáticas. Você só precisa ligar todas as bibliotecas estáticas em seu projeto principal. Dessa forma, o compilador não vai reclamar sobre vários símbolos.

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