【问题标题】:Statically linking Visual Studio dlls to dynamically linked sfml project将 Visual Studio dll 静态链接到动态链接的 sfml 项目
【发布时间】:2018-07-01 21:25:25
【问题描述】:

我有一个 SFML、Visual Studio 项目,需要使用运行时库设置中的 /MT 选项进行链接,因为我想避免必须将 microsoft redistributable 安装到运行该程序的每台计算机。

当我将 sfml 添加到项目中时,它的动态形式似乎可以正常工作。但是,当我在另一台计算机上尝试该程序时,它告诉我缺少 Visual Studio dll。

我了解,为了将 sfml 静态链接到项目,我必须使用不同的运行时库重新构建它。我的问题是,如果它无法将必要的 Visual Studio dll 静态链接到项目,为什么它能够使用动态链接到项目的 sfml 正确编译并同时将项目设置为 /MT?

【问题讨论】:

  • 我的问题是动态链接 sfml 和静态链接运行时库会导致程序以某种方式需要可再发行组件。由于我无法控制的原因,我无法将可再发行组件安装到我希望使用它的每台计算机上。
  • 哦,好的,我明白了。谢谢你的帮助。如果您将其发布为答案,我会将其标记为正确。 :)

标签: c++ visual-studio sfml


【解决方案1】:

在 cmets 讨论后,我们达成了一致:

静态链接一些库并仍然动态链接到其他库的情况并不少见,例如语言运行时。所以编译器不应该抱怨这个。

要获得包含所有内容的单个可执行文件,程序必须静态链接所有库,并且它们也必须静态链接到它们的所有依赖项。

否则,如果我们有一个动态库,例如 SFML,那么该库很可能又会动态链接到运行时库。这仍然需要运行时 DLL。

【讨论】:

    【解决方案2】:

    这是可能的,您只需要自己构建 SFML(这并不难)。

    只需确保将 CMake 变量 SFML_USE_STATIC_STD_LIBS 设置为 TRUE,以便 SFML 使用静态运行时,无论您实际上是在创建静态库还是共享库。

    简而言之:

    • 克隆official repository
    • 安装CMake。 (如果您使用的是 Visual Studio 2017,您也可以直接将源目录作为文件夹打开,但这样设置变量有点棘手。)
    • 创建一个构建目录,去那里运行CMake:cmake -DSFML_USE_STATIC_STD_LIBS=TRUE -DCMAKE_INSTALL_PREFIX=C:/path/where/to/install/SFML C:/path/to/the/cloned/source/repository
    • 完成后,您将找到 Visual Studio 解决方案和项目。
    • 只需为 Debug/Release 目标构建 INSTALL 项目,您就可以使用静态运行时获得共享的 SFML。

    【讨论】:

      猜你喜欢
      • 2016-10-19
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      相关资源
      最近更新 更多