【发布时间】: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