Como faço um .exe totalmente vinculado estaticamente com o Visual Studio Express 2005?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Meu atual ambiente C++ preferido é a edição gratuita e excelente do Microsoft Visual Studio 2005 Express.De vez em quando, envio arquivos .exe de lançamento para outras pessoas com resultados agradáveis.No entanto, recentemente fiz a descoberta perturbadora de que os resultados agradáveis ​​se baseavam em mais sorte do que eu gostaria.A tentativa de executar um desses programas em uma caixa XP antiga (safra de 2001, não escrupulosamente atualizada) não me deu nada além de uma mensagem desagradável "O sistema não pode executar x.exe" (ou similar).

Algumas pesquisas no Google revelaram que, com este conjunto de ferramentas, até mesmo a especificação de links estáticos resulta em um simples hello-world.exe, na verdade, dependendo de arquivos .dll extras (msvcm80.dll etc.).Um sistema de esquema de versão incrivelmente elaborado (arquivos de manifesto, alguém?) Não permitirá que o .exe seja executado sem exatamente as versões .dll corretas.Eu não quero ou preciso dessas coisas, eu só quero um .exe independente e antiquado que não faça nada além de operações Win32 de menor denominador comum e seja executado em qualquer sistema operacional Win32 antigo.

Alguém sabe se é possível fazer o que quero com meu conjunto de ferramentas existente?

Obrigado.

Foi útil?

Solução

Para o tempo de execução C, vá para as configurações do projeto, escolha C/C++ e depois 'Geração de Código'.Altere a configuração de 'biblioteca de tempo de execução' para 'multithreaded' em vez de 'dll multithreaded'.

Se você estiver usando qualquer outra biblioteca, talvez seja necessário informar ao vinculador para ignorar explicitamente o CRT vinculado dinamicamente.

Outras dicas

Minha experiência no Visual Studio 2010 é que são necessárias duas alterações para não precisar de DLLs.Na página de propriedades do projeto (clique com o botão direito no nome do projeto na janela Solution Explorer):

  1. Em Propriedades de configuração -> Geral, altere o campo "Uso de MFC" para "Usar MFC em uma biblioteca estática".

  2. Em Propriedades de configuração --> C/C++ --> Geração de código, altere o campo "Runtime Library" para "Multi-Threaded (/MT)"

Não sei por que ambos eram necessários.Usei isso para remover uma dependência de glut32.dll.

Adicionado posteriormente:Ao fazer essas alterações nas configurações, você deve fazê-las em "Todas as configurações" --- você pode selecionar esta opção na parte superior da janela Propriedades.Se você fizer a alteração apenas na configuração de depuração, ela não se aplicará à configuração de versão e vice-versa.

Eu tive esse mesmo problema de dependência e também sei que você pode incluir as DLLs do VS 8.0 (somente versão!não depurar!---e seu programa também deve ser lançado) em uma pasta com o nome apropriado, na pasta pai com seu .exe:

Como:Implantar usando XCopy (MSDN)

Observe também que é garantido que as coisas darão errado se você precisar ter código C++ e C no mesmo .exe vinculado estaticamente, porque você obterá conflitos de vinculador que só podem ser resolvidos ignorando o libXXX.lib correto e vinculando dinamicamente (DLLs) .

Por último, com um conjunto de ferramentas diferente (VC++ 6.0) as coisas "simplesmente funcionam", já que o Windows 2000 e superior possuem as DLLs corretas instaladas.

No que diz respeito à resposta de Jared, ter o Windows 2000 ou superior não resolverá necessariamente o problema em questão.A resposta de Rob funciona, no entanto, é possível que esta correção introduza problemas de segurança, já que as atualizações do Windows não serão capazes de corrigir aplicativos criados como tal.

Em outra postagem, Nick Guerrera sugere empacotar o Visual C++ Runtime Redistributable com seus aplicativos, que é instalado rapidamente e é independente do Visual Studio.

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