将 Visual Studio 个 dll 静态链接到动态链接的 sfml 项目
Statically linking Visual Studio dlls to dynamically linked sfml project
我有一个 SFML,Visual Studio 项目需要使用运行时库设置中的 /MT 选项 linked,因为我想避免在每台计算机上安装可再发行的 Microsoft运行程序。
当我将 sfml 添加到项目中时,它似乎以动态形式运行良好。但是,当我在另一台计算机上尝试该程序时,它告诉我缺少 visual studio dll。
我知道,为了 link sfml 静态地添加到项目中,我必须使用不同的运行时库重建它。我的问题是,如果它无法静态地 link 必要的 [=18],为什么它能够正确地使用 sfml 动态编译 linked 到项目并同时将项目设置为 /MT =] dll 到项目?
经过评论区的讨论,我们达成一致:
静态地 link 某些库,而对其他库动态地 link 的情况并不少见,例如语言运行时。所以编译器不应该抱怨这个。
要获得包含所有内容的单个可执行文件,程序必须 link 所有静态库,反过来,它们也必须 link 静态地访问所有依赖项。
否则,如果我们有一个动态库,如 SFML,该库可能会 link 动态地转为运行时库。这仍然需要运行时 DLL。
这是可能的,您只需要自己构建 SFML(这并不难)。
只需确保将 CMake 变量 SFML_USE_STATIC_STD_LIBS
设置为 TRUE
,以便 SFML 使用静态 运行time,无论您实际上是在创建静态库还是共享库。
简而言之:
- 克隆 official repository.
- 安装CMake。 (如果你用的是Visual Studio 2017,你也可以直接把源码目录作为Folder打开,但是这样设置变量有点麻烦。)
- 创建一个构建目录,去那里 运行 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
项目,您将使用静态 运行time 获得共享的 SFML。
我有一个 SFML,Visual Studio 项目需要使用运行时库设置中的 /MT 选项 linked,因为我想避免在每台计算机上安装可再发行的 Microsoft运行程序。
当我将 sfml 添加到项目中时,它似乎以动态形式运行良好。但是,当我在另一台计算机上尝试该程序时,它告诉我缺少 visual studio dll。
我知道,为了 link sfml 静态地添加到项目中,我必须使用不同的运行时库重建它。我的问题是,如果它无法静态地 link 必要的 [=18],为什么它能够正确地使用 sfml 动态编译 linked 到项目并同时将项目设置为 /MT =] dll 到项目?
经过评论区的讨论,我们达成一致:
静态地 link 某些库,而对其他库动态地 link 的情况并不少见,例如语言运行时。所以编译器不应该抱怨这个。
要获得包含所有内容的单个可执行文件,程序必须 link 所有静态库,反过来,它们也必须 link 静态地访问所有依赖项。
否则,如果我们有一个动态库,如 SFML,该库可能会 link 动态地转为运行时库。这仍然需要运行时 DLL。
这是可能的,您只需要自己构建 SFML(这并不难)。
只需确保将 CMake 变量 SFML_USE_STATIC_STD_LIBS
设置为 TRUE
,以便 SFML 使用静态 运行time,无论您实际上是在创建静态库还是共享库。
简而言之:
- 克隆 official repository.
- 安装CMake。 (如果你用的是Visual Studio 2017,你也可以直接把源码目录作为Folder打开,但是这样设置变量有点麻烦。)
- 创建一个构建目录,去那里 运行 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
项目,您将使用静态 运行time 获得共享的 SFML。