【问题标题】:(Visual Studio) Lot of linker errors when trying to link microsoft libraries statically with SFML libs(Visual Studio) 尝试将 Microsoft 库与 SFML 库静态链接时出现大量链接器错误
【发布时间】:2016-06-10 16:30:23
【问题描述】:

所以我需要一个防白痴的应用程序。 我已经完成了,但是当我尝试在裸 Windows 7 虚拟机中运行它时,我遇到了很多错误,例如缺少 msvcp140.dll 等等。 所以我正在搜索谷歌以静态链接这些。 我发现我应该在项目代码生成选项中更改它,所以我做到了。 我也有静态链接的 SFML。 问题是我收到很多引用 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

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

【问题讨论】:

  • 最简单的方法是用另一个编译器编译它(参见 SFML 网站上的说明),这样您就不需要 Visual Studio 编译器需要的那些微软库。或者只是将这些 .dll 包含在您的应用程序中,假设您不仅限于可执行文件。
  • @Noctiphobia 问题是我需要使用 Visual Studio,因为我的应用程序同时使用 SFML 和 winapi(winapi 用于定义 sfml 窗口的外观)所以我现在需要使用 Visual Studio 我只是想生病使用 cmake 重新编译 sfml 但我找不到编译器 anc cxx 未找到编译器,我不知道为什么但我会尝试弄清楚

标签: c++ visual-studio static linker sfml


【解决方案1】:

我很确定我只是通过阅读错误消息、思考术语“RuntimeLibrary”以及它是如何说“DynamicRelease”和“StaticRelease”之间不匹配的方式来解决您的问题的。我的直觉是,您试图将针对某个版本的 CRT 编译的库与针对不同版本的 CRT 的应用程序结合起来。鉴于“MD”和“MT”是编译器开关,分别控制您是动态链接还是静态链接运行时,这也是一个很好的线索。

但为了确定起见,我使用了实际的错误代码 (LNK2038) 并在 the documentation 中查找。果然,它包含一段准确描述问题的段落:

运行时库

指示应用或库使用的 C++ 标准库和 C 运行时的版本。使用一个版本的 C++ 标准库或 C 运行时的代码与使用不同版本的代码不兼容。如需更多信息,请参阅/MD, /MT, /LD (Use Run-Time Library)

多年来,链接器变得越来越聪明。它试图保护你不犯严重的错误。链接在一起的所有模块都需要经过编译以针对相同类型的运行时库。如果您希望应用静态链接到 CRT (/MT),您还需要静态链接库 (/MT)。
项目属性 → 配置属性 → C/C++ → 代码生成 → 运行时库。
不要忘记重建所有。

【讨论】:

  • 我不知道该怎么办,解释对我来说有点不清楚。
  • 在项目属性 → 配置属性 → C/C++ → 代码生成 → 运行时库中,我检查了 /mt,并且我也使用了静态版本的 sfml
  • 您必须更改的编译方式,而不仅仅是应用程序。这就是他们必须匹配的重点。
猜你喜欢
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
相关资源
最近更新 更多