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

Bil*_*ter 99 c++ linker visual-studio

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

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

有谁知道它是否可以用我现有的工具集做我想做的事情?

谢谢.

Rob*_*ker 116

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

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

  • 男人300个字不多.如果上面的注释不清楚,问题是您的.cpp文件和任何库.cpp文件都需要"多线程"而不是"多线程dll",否则您可能会收到链接错误. (6认同)
  • 疯狂的Eddie:哪个堆管理问题? (4认同)
  • 我得到'错误LNK2038:检测到'RuntimeLibrary'不匹配:值'MD_DynamicRelease'与值'MT_StaticRelease'不匹配.还有其他地方可以改变构建的类型吗?我正在构建wxWigets应用程序,就像@BillForster一样.那么我必须*重建*wxWidgets吗?我怎么做? (3认同)
  • 那c ++运行时呢? (2认同)

Sam*_*uss 14

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

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

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

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

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


Jar*_*ike 5

我遇到了同样的依赖问题,我也知道您可以将 VS 8.0 DLL(仅发布!不能调试!---并且您的程序也必须发布)包含在适当名称的文件夹中,在带有 .exe 的父文件夹:

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

另请注意,如果您需要在同一个静态链接的 .exe 中使用 C++ 和 C 代码,事情肯定会出错,因为您会遇到链接器冲突,而这种冲突只能通过忽略正确的 libXXX.lib 然后动态链接(DLL)来解决.

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