将Visual Studio dll静态链接到动态链接的SFML项目

时间:2018-07-01 21:25:26

标签: c++ visual-studio sfml

我有一个SFML,Visual Studio项目,需要在运行时库设置中使用/ MT选项进行链接,因为我想避免必须安装可重新分发给运行该程序的每台计算机的Microsoft。

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

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

2 个答案:

答案 0 :(得分:2)

在评论中进行讨论之后,我们对此达成了共识:

静态链接某些库并仍然动态链接到其他库(例如语言运行库)并不少见。因此,编译器不应对此抱怨。

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

否则,如果我们有一个动态库(如SFML),则该库可能会依次动态链接到运行时库。而且仍然需要运行时DLL。

答案 1 :(得分:1)

这是可能的,您只需要自己构建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。