我当前首选的 C++ 环境是免费且非常优秀的 Microsoft Visual Studio 2005 Express 版本。我有时会向其他人发送发布的 .exe 文件,并取得令人满意的结果。然而最近我有了一个令人不安的发现,令人高兴的结果是基于我想要的更多运气。尝试在旧的(2001 年老式的,没有严格更新的)XP 机器上运行这些程序之一,只给我带来了一条令人讨厌的“系统无法运行 x.exe”(或类似的)消息。

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

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

谢谢。

有帮助吗?

解决方案

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

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

其他提示

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

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

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

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

稍后添加:对配置进行这些更改时,应将其设置为“所有配置”——您可以在“属性”窗口顶部选择此项。如果您仅对“调试”配置进行更改,则它将不会应用于“发布”配置,反之亦然。

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top