【问题标题】:Switching to non-debug runtime /MT causes link errors切换到非调试运行时 /MT 会导致链接错误
【发布时间】:2015-12-02 11:42:51
【问题描述】:

我正在尝试将我的可执行文件部署到另一台机器上,因此我需要非调试运行时。

切换到非调试运行时 /MT 会导致链接错误。 /Mtd 编译得很好。这是许多错误的示例。

1>libcpmtd.lib(_tolower.obj):错误 LNK2001:未解析的外部符号 _calloc_dbg 1>libcpmtd.lib(locale.obj) : 错误 LNK2001: 无法解析的外部符号 _calloc_dbg 1>libcpmtd.lib(wlocale.obj) : 错误 LNK2001: 无法解析的外部符号 _calloc_dbg 1>libcpmtd.lib(StlCompareStringA.obj) : 错误 LNK2001: 无法解析的外部符号 _free_dbg 1>libcpmtd.lib(locale.obj) : 错误 LNK2001: 无法解析的外部符号 _free_dbg 1>libcpmtd.lib(wlocale.obj) : 错误 LNK2001: 无法解析的外部符号 _free_dbg 1>libcpmtd.lib(xlocale.obj) : 错误 LNK2001: 无法解析的外部符号 _free_dbg 1>libcpmtd.lib(xwcsxfrm.obj) : error LNK2001: unresolved external symbol _free_dbg

如果我明确告诉链接器与 libcmtd.lib 链接,即使使用 /MT 也会编译,但这样做的后果是什么?

如何让我的代码编译? (不必做上面的伎俩?)

编辑:我用 cout 注释掉了这些语句,它编译了......为什么......

【问题讨论】:

  • 看起来您强制内存分配器在某处使用 degug 版本。在你的代码中寻找一个讨厌的 _CRTDBG_MAP_ALLOC 定义,或者对于旧的 MSVC 版本可能有一些其他类似的技巧。
  • libcpmtd.lib 是多线程调试 C++ DLL。猜测你有一个内置的 .obj 文件发布,另一个内置调试。这会导致包含对发布库和调试库的引用,并且链接器首先检查的任何一个都是它用于可在 lib 中找到的其他符号的那个。当它选择调试 C++ 库和发布 CRT 库时会出现错误。注释掉 cout 会更改库的搜索顺序,并且显式使用 libcmtd.lib 会导致它在发布版本之前使用调试 CRT。确保所有内容都在发行版中编译。
  • 这对我有用:将调试配置设置为 /MTd,将发布设置为 /MT

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


【解决方案1】:

您说您明确强制 libcmtd.lib 作为链接器输入 - 这是静态 CRT 的 debug 版本,并且正是与 /MT 冲突的根源(声明与发布静态 CRT)。

从链接器输入中完全删除 libcmtd 并检查它是否有效。

【讨论】:

    【解决方案2】:

    从 C++ 预处理器中删除 _DEBUG 定义

    【讨论】:

    • 错误太多。当我将模式更改为发布时,所有错误都消失了。 +1
    【解决方案3】:

    在某些情况下,我的应用程序使用 /MT,而我的 libcpmtd.lib 构建时没有 /MT。切换到相同的解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2013-03-01
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多