【问题标题】:MT / MD mismatch when compiling cryptopp despite no library dependencies尽管没有库依赖项,但编译 cryptopp 时 MT / MD 不匹配
【发布时间】:2015-04-10 05:44:18
【问题描述】:

我目前正在尝试在 Windows 8.1 机器上使用 MS Visual Studio 2013 编译静态 64 位版本的 cryptopp(更准确地说是 cryptlib VS 项目)。由于它是静态发布版本,因此我将运行时库设置为多线程 (/MT)。

但是链接器会抛出以下几个错误:

error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in adhoc.obj

在我在这里和谷歌上发现的大多数类似情况下,这是由一个库设置 /MT 和另一个库设置 /MD 引起的。这种情况的奇怪之处在于链接器不包含任何库(可能除了一些 Visual-Studio 内部的魔法)并且没有额外的包含目录。链接器命令行汇编为:

/OUT:"build\x64\static_release\cryptlib64.lib" /LTCG /MACHINE:X64 /NOLOGO

在项目文件中,除了项目级别的设置外,我找不到任何其他 设置,因此我假设没有具有 /MD 开关的 .cpp 文件。

总而言之,这意味着我的库定义了 /MT,但是 crytlib 内部使用的东西似乎定义了 /MD。有没有办法找出那个开关定义了什么对象/cpp/define/library/whatever?

【问题讨论】:

  • 您可以非常安全地假设它确实链接了其他库。可能通过源代码中某处的#pragma 注释指示这样做。通常也是一个强烈的暗示,只有 /MD 才能工作。使用 /VERBOSE 链接器选项,您会看到库被加载和搜索。
  • 确实有一些库包含的编译指示帮助我找出我犯了哪些预处理器定义错误。将您的评论作为答案,我会接受。
  • /LTCG 也对事物进行了一些限制。过去我在使用 Crypto++ 时遇到过问题。我认为的解决方法是使用动态 C 运行时链接重新编译 Crypto++ 静态库。 (默认情况下,Crypto+ 静态库是使用静态 C 运行时链接构建的。因此使用 /MT/MD 出现问题的原因。

标签: c++ visual-c++ visual-studio-2013 linker-errors crypto++


【解决方案1】:

清理解决方案然后重建可能会有所帮助。似乎链接器仍在尝试使用旧的目标文件(在您应用 /MT 之前)。

【讨论】:

  • 不幸的是,这发生在第一次构建时
  • 那么不幸的是我的回答是无关紧要的。但是由于错误消息显示“adhoc.obj”,因此名称为“adhoc”的东西可能是有问题的库。看来库文件未编译为用作静态库。
【解决方案2】:

此链接器诊断是 100% 准确的提示,表明您实际上正在链接构建错误的 .obj 或 .lib 文件。几乎总是 .lib 文件是您不知道的,因为您不必将它们显式列为附加依赖项。 MSVC++ 可以很容易地指定链接依赖项,而无需使用设置,例如在源代码文件中使用添加引用或#pragma comment(lib, "yadayada.lib")。当然非常方便,但当您尝试解决此类链接器错误时却不那么明显。

它很容易诊断,但是链接器有一个选项可以显示它实际链接的内容。使用 Project + Properties、Linker、Command Line 并添加 /VERBOSE 选项。链接器现在对输出窗口变得非常健谈,向您显示它加载的每个 .lib 文件以及它使用 .lib 文件中的哪些符号。

.lib 名称应该足以提示您知道从哪里开始查找,您应该从那里知道#include。您是否可以真的使用 /MT 构建仍然悬而未决,如果它是 DLL 的导入库,那么可能性会迅速减小。避免强迫它,在一个进程中拥有多个 CRT 副本会带来麻烦。

【讨论】:

    【解决方案3】:

    这个案例的奇怪之处在于链接器不包含任何库(可能除了一些 Visual-Studio 内部的魔法)

    如果你确定它不是你装备中的东西,那很有可能就是它的来源。

    如果动态 C++ 运行时链接是您的一个选项,那么您可以考虑将它用于 Crypto++。为了缓解将 Crypto++ 转换为 Visual Studio 2010(及更高版本)和转换为/MD/MDd 的麻烦,您可以使用vs2010-dynamic.zip。只需在现有 Crypto++ 源代码之上解压即可。


    另请参阅 Stack Overflow 上的 Mismatch Detected for 'RuntimeLibrary' and Crypto++

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 2021-11-23
      • 2010-10-19
      相关资源
      最近更新 更多