如何使用Visual Studio Express 2005创建完全静态链接的.exe?

时间:2008-09-01 02:49:02

标签: c++ visual-studio linker

我目前首选的C ++环境是免费且非常出色的Microsoft Visual Studio 2005 Express版本。我不时将发布的.exe文件发送给其他人,结果令人满意。然而,最近我做了一个令人不安的发现,令人愉快的结果是基于我想要的更多运气。尝试在一个旧的(2001年份,没有经过严格更新)的XP盒子上运行其中一个程序,只给我一个讨厌的“系统无法运行x.exe”(或类似)消息。

一些谷歌搜索显示,使用此工具集,即使指定静态链接,也会产生一个简单的hello-world.exe,实际上依赖于额外的.dll文件(msvcm80.dll等)。一个非常复杂的版本策划系统(清单文件任何人?)然后将不会让.exe运行没有完全正确的.dll版本。我不想要或不需要这些东西,我只想要一个老式的自包含.exe,除了最低的公分母Win32操作之外什么也不做,并在任何旧的win32操作系统上运行。

是否有人知道我是否可以使用现有工具集执行操作?

谢谢。

4 个答案:

答案 0 :(得分:113)

对于C-runtime进入项目设置,选择C / C ++然后选择'Code Generation'。将“运行时库”设置更改为“多线程”而不是“多线程dll”。

如果您正在使用任何其他库,则可能需要告知链接器明确忽略动态链接的CRT。

答案 1 :(得分:11)

我在Visual Studio 2010中的经验是,需要进行两项更改,以便不需要DLL。从项目属性页面(右键单击Solution Explorer窗口中的项目名称):

  1. 在配置属性下 - >常规,将“使用MFC”字段更改为“在静态库中使用MFC”。

  2. 在配置属性下 - > C / C ++ - >代码生成,将“运行时库”字段更改为“多线程(/ MT)”

  3. 不确定为什么两者都需要。我用它来删除对glut32.dll的依赖。

    稍后添加:对配置进行这些更改时,应将它们设置为“所有配置”---您可以在“属性”窗口的顶部选择此项。如果仅对Debug配置进行更改,则它将不适用于Release配置,反之亦然。

答案 2 :(得分:4)

我有同样的依赖问题,我也知道你可以在一个相应名称的文件夹中包含VS 8.0 DLL(仅发布!不调试!---并且你的程序也必须发布) ,在包含.exe的父文件夹中:

How to: Deploy using XCopy (MSDN)

另请注意,如果您需要在相同的静态链接.exe中使用C ++和C代码,则会出现问题,因为您将遇到只能通过忽略正确的libXXX.lib然后动态链接才能解决的链接器冲突(DLL)的

最后,使用不同的工具集(VC ++ 6.0),“正常工作”,因为Windows 2000及更高版本安装了正确的DLL。

答案 3 :(得分:1)

关于Jared的回应,拥有Windows 2000或更高版本并不一定能解决手头的问题。 Rob的响应确实有效,但是此修复可能会引入安全问题,因为Windows更新将无法修补这样构建的应用程序。

在另一篇文章中,Nick Guerrera建议将Visual C ++ Runtime Redistributable打包到您的应用程序中,这些应用程序可以快速安装,并且独立于Visual Studio。