切换到非调试运行时/MT会导致链接错误

11

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

切换到非调试运行时/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) :错误 LNK2001:无法解析的外部符号_free_dbg

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

如何使我的代码编译?(而不必做上述技巧?)

编辑:我注释掉了使用cout的语句,然后它就编译了....为什么......


看起来你在某个地方强制内存分配器使用了调试版本。在你的代码中寻找讨厌的_CRTDBG_MAP_ALLOC定义,或者在旧的MSVC版本中可能还有其他类似的技巧。 - kuroi neko
1
libcpmtd.lib是多线程调试C++ DLL。猜测您有一个在release模式下构建的.obj文件,另一个在debug模式下构建。这会导致对release和debug库的引用都被包含,并且链接器首先检查哪个库用于可以在lib中找到的其他符号。当它选择debug C++ lib和release CRT lib时,就会出现错误。注释掉cout会改变库搜索顺序,并明确使用libcmtd.lib使其在使用release之前使用debug CRT。请确保所有内容都是在release模式下编译的。 - 1201ProgramAlarm
这对我有效:将Debug配置设置为/MTd,将Release配置设置为/MT。 - forthe
如果某个答案解决了您的问题,请考虑接受它。 - Ofek Shilon
3个回答

10

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


之前出现了太多错误。当我将模式改为发布模式时,所有错误都消失了。+1 - Gray Programmerz

9
你说你明确强制使用libcmtd.lib作为链接器输入 - 这是静态CRT的debug版本,正是与/MT(一个声明与release静态CRT链接的开关)冲突的源头。

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


0
在我的情况下,我的应用程序使用了/MT,而我的libcpmtd.lib没有使用/MT进行构建。切换到相同的设置解决了这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接