127

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

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

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

谢谢你。

4

4 回答 4

145

对于 C 运行时,转到项目设置,选择 C/C++,然后选择“代码生成”。将“运行时库”设置更改为“多线程”而不是“多线程 dll”。

如果您使用任何其他库,您可能需要告诉链接器显式忽略动态链接的 CRT。

于 2008-09-01T02:55:07.780 回答
23

我在 Visual Studio 2010 中的经验是,需要进行两项更改才能不需要 DLL。从项目属性页面(在解决方案资源管理器窗口中右键单击项目名称):

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

  2. 在 Configuration Properties --> C/C++ --> Code Generation 下,将“Runtime Library”字段更改为“Multi-Threaded (/MT)”

不知道为什么两者都需要。我用它来消除对 glut32.dll 的依赖。

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

于 2016-01-24T21:27:43.850 回答
5

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

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

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

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

于 2008-09-01T02:59:55.397 回答
2

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

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

于 2011-06-06T18:28:58.963 回答