Meu ambiente C ++ preferido atualmente é a edição gratuita e amplamente 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 satisfatórios foram baseados em mais sorte do que eu gostaria. A tentativa de executar um desses programas em uma caixa XP antiga (vintage de 2001, não cuidadosamente atualizada) não me deu nada além de uma mensagem desagradável "O sistema não pode executar x.exe" (ou semelhante).
Algumas pesquisas no Google revelaram que, com esse conjunto de ferramentas, até mesmo a especificação de links estáticos resulta em um simples hello-world.exe, na verdade, contando com arquivos .dll extras (msvcm80.dll etc.). Um sistema de esquema de versões 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 antigo .exe autocontido que não faz nada além de operações Win32 de menor denominador comum e roda em qualquer sistema operacional win32 antigo.
Alguém sabe se é possível fazer o que quero fazer com meu conjunto de ferramentas existente?
Obrigado.
fonte
error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'
. Existe algum outro lugar para alterar o tipo de construção? Estou construindo o aplicativo wxWigets, muito parecido com @BillForster. Então, terei que reconstruir wxWidgets? Como faço isso?Minha experiência no Visual Studio 2010 é que são necessárias duas alterações para não precisar de DLL's. Na página de propriedades do projeto (clique com o botão direito no nome do projeto na janela do Solution Explorer):
Em Propriedades de configuração -> Geral, altere o campo "Uso de MFC" para "Usar MFC em uma biblioteca estática".
Em Propriedades de configuração -> C / C ++ -> Geração de código, altere o campo "Biblioteca de tempo de execução" para "Multi-Threaded (/ MT)"
Não sei por que ambos eram necessários. Usei isso para remover uma dependência do glut32.dll.
Adicionado mais tarde: Ao fazer essas alterações nas configurações, você deve fazê-las em "Todas as configurações" --- você pode selecionar isso no topo da janela Propriedades. Se você alterar apenas a configuração de depuração, ela não se aplicará à configuração de lançamento e vice-versa.
fonte
Eu tive esse mesmo problema de dependência e também sei que você pode incluir as DLLs do VS 8.0 (somente lançamento! Não depurar! --- e seu programa também deve ser lançado) em uma pasta com o nome apropriado, no pasta pai com seu .exe:
Como: implantar usando XCopy (MSDN)
Observe também que as coisas correrão mal se você precisar ter o 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", uma vez que o Windows 2000 e superior têm as DLLs corretas instaladas.
fonte
Em relação à resposta de Jared, ter o Windows 2000 ou melhor não necessariamente resolverá o problema em questão. A resposta de Rob funciona, no entanto, é possível que essa correção introduza problemas de segurança, pois 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.
fonte