(Visual Studio)尝试使用 SFML 库静态 link 微软库时出现很多 linker 错误

(Visual Studio) Lot of linker errors when trying to link microsoft libraries statically with SFML libs

所以我需要一个傻瓜应用程序。 我已经完成了,但是当我尝试 运行 它在裸机 windows 7 虚拟机中时,我遇到了很多错误,例如 msvcp140.dll 丢失等等。 所以我正在搜索 google 以便静态 link 那些。 我发现我应该在项目代码生成选项中更改它,所以我做到了。 我也静态编辑了 SFML link。 问题是我遇到很多 linker 错误参考 SFML,例如:

sfml-system-s.lib(String.cpp.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease' in main.obj

我不确定为什么会这样,所以我在这里寻求帮助

我很确定我只是通过阅读错误消息、思考术语 "RuntimeLibrary" 以及它是如何说 "DynamicRelease" 和 "StaticRelease"。我的直觉告诉我,您正在尝试将针对一个版本的 CRT 编译的库与针对不同版本的 CRT 的应用程序结合起来。鉴于 "MD" 和 "MT" 是编译器开关,它们分别控制您是动态地还是静态地 linking 运行 时间,这也是一个很好的线索。

但为了确定,我获取了实际的错误代码 (LNK2038) 并在 the documentation 中进行了查找。果然里面有一段描述问题的很准确:

RuntimeLibrary

Indicates the version of the C++ Standard Library and C runtime that's used by an app or library. Code that uses one version of the C++ Standard Library or C runtime is incompatible with code that uses a different version. For more information, see /MD, /MT, /LD (Use Run-Time Library).

linker 这些年来变得聪明了。它试图保护您免于犯下严重错误。所有被 link 编辑在一起的模块都需要编译为针对相同类型的 运行-time 库。如果您希望应用程序静态地 link 到 CRT (/MT),您还需要将库 link 静态化 (/MT)。
项目属性 → 配置属性 → C/C++ → 代码生成 → 运行时库。
不要忘记全部重建。