代码之家  ›  专栏  ›  技术社区  ›  Bill Forster

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

  •  93
  • Bill Forster  · 技术社区  · 18 年前

    我目前首选的C++环境是免费的,并且非常出色的微软Visual Studio 2005 Express版。我不时向其他人发送release.exe文件,结果令人满意。然而,最近我发现令人不安的是,令人高兴的结果是基于我想要的更多运气。试图在一个旧的(2001年过时的,没有严格更新的)XP机器上运行其中一个程序时,我只收到了一条令人讨厌的“System cannot run x.exe”(或类似的)消息。

    一些谷歌搜索显示,使用此工具集,即使指定静态链接,也会产生一个简单的hello-world.exe,实际上它依赖于额外的.dll文件(msvcm80.dll等)。一个极其复杂的版本规划系统(manifest files any?)在没有正确的.dll版本的情况下不会让.exe运行。我不想要也不需要这些东西,我只想要一个老式的自给自足的.exe,它只做最低公分母的Win32操作,在任何旧的Win32操作系统上运行。

    有人知道我想用现有的工具集做什么是可能的吗?

    非常感谢。

    4 回复  |  直到 18 年前
        1
  •  139
  •   Rob Walker    18 年前

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

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

        2
  •  23
  •   Sam Buss    8 年前

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

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

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

        3
  •  5
  •   Aykhan Hagverdili    6 年前

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

    How to: Deploy using XCopy (MSDN)

    还要注意的是,如果你需要在同一个静态链接.exe中有C++和C代码,那么事情就会出错,因为你会得到链接冲突,这些冲突只能通过忽略正确的LIbxx.LIB然后动态链接(DLL)来解决。

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

        4
  •  2
  •   bunkerdive    15 年前

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