【问题标题】:How do I make a fully statically linked .exe with Visual Studio Express 2005?如何使用 Visual Studio Express 2005 制作完全静态链接的 .exe?
【发布时间】:2010-09-07 10:25:38
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

    标签: c++ visual-studio linker


    【解决方案1】:

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

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

    【讨论】:

    • "如果您使用任何其他库,您可能需要告诉链接器显式忽略动态链接的 CRT。"最近我遇到了这个问题。我正在构建一个 wxWidgets 应用程序,我发现我需要使用相同的代码生成修改来重建 wxWidgets 库
    • Man 300 个字符并不多。如果上面的评论不清楚,问题是您的 .cpp 文件和任何库 .cpp 文件都需要具有“多线程”而不是“多线程 dll”,否则您可能会收到链接错误。
    • 这引入了许多关于堆管理的问题,您可能不想涉及这些问题。
    • 我收到error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'。还有其他地方可以更改构建的类型吗?我正在构建 wxWigets 应用程序,就像@BillForster 一样。那么我是否必须重建 wxWidgets?我该怎么做?
    • @EdwardStrange 什么样的问题?
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 这似乎可以在 Visual Studio 2013 中使用,但有一个小补充:我必须将配置属性 -> 常规 -> 字符集更改为“使用 Unicode 字符集”。
    【解决方案3】:

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

    How to: Deploy using XCopy (MSDN)

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 虽然打包可再发行组件似乎是首选解决方案,但您需要管理员权限才能运行可再发行组件安装程序。如果您有任何非管理员用户,这不是一个可行的选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多