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

我目前首选的C ++环境是免费的,基本上非常出色的Microsoft Visual Studio 2005 Express版本。 我不时有发送.exe文件给其他人的结果令人满意。 然而最近我发现了一个令人不安的发现,那就是我喜欢的运气多得令人满意。 试图在一个旧的(2001年份,没有仔细更新的)XP盒子上运行这些程序中的一个,只给了我一个讨厌的“系统无法运行x.exe”(或类似的)消息。

一些谷歌search显示,使用这个工具集,甚至指定静态链接结果在一个简单的hello-world.exe实际上依靠额外的.dll文件(msvcm80.dll等)。 一个令人难以置信的精心版本计划系统(清单文件任何人?),然后将不会让.exe运行没有完全正确的.dll版本。 我不想或不需要这些东西,我只想要一个老式的自包含的.exe,除了最低的共同点Win32操作之外什么也不做,可以运行在任何老式的win32操作系统上。

有谁知道是否有可能做我想用我现有的工具集?

谢谢。

对于C运行时转到项目设置,selectC / C + +,然后“代码生成”。 将“运行时库”设置更改为“multithreading”而不是“multithreadingDLL”。

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

我有这个相同的依赖关系的问题,我也知道你可以包含在VS 8.0的DLL(只发布!不要debugging!,你的程序也必须释放)在一个合适的名称的文件夹中父文件夹与您的.exe:

如何使用XCopy(MSDN)进行部署

另外请注意,如果您需要将C ++代码和C代码放在同一个静态链接的.exe文件中,则可以确保事情会发生错误,因为您将得到链接器冲突,只能通过忽略正确的libXXX.lib然后dynamic链接(DLL) 。

最后,使用不同的工具集(VC ++ 6.0)的东西“只是工作”,因为Windows 2000及以上具有安装正确的DLL。

我在Visual Studio 2010中的经验是需要两个更改,以便不需要DLL。 从项目属性页面(右键单击解决scheme资源pipe理器窗口中的项目名称):

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

  2. 在configuration属性 – > C / C ++ – >代码生成下,将“运行时库”字段更改为“multithreading(/ MT)”

不知道为什么这两个都需要。 我用这个去除了对glut32.dll的依赖。

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

在另一篇文章中,Nick Guerrerabuild议将Visual C ++ Runtime Redistributable与应用程序一起打包,该应用程序可以快速安装,而且独立于Visual Studio。