将配置从Debug更改为Release时的链接错误

时间:2011-04-03 15:10:43

标签: c++ compiler-errors

您好 我在VC ++ 2008中有项目 这个项目在调试模式下编译没有错误 但是当我尝试在发布模式下构建它时,我会在下面链接erorr。

1>Linking...
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __heap_alloc already defined in LIBCMT.lib(malloc.obj)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __recalloc already defined in LIBCMT.lib(recalloc.obj)
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __msize already defined in LIBCMT.lib(msize.obj)
1>LIBCMTD.lib(malloc.obj) : error LNK2005: _V6_HeapAlloc already defined in LIBCMT.lib(malloc.obj)
1>LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook already defined in LIBCMT.lib(dbghook.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_pHeaderDefer already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __get_sbh_threshold already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __set_sbh_threshold already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __set_amblksiz already defined in LIBCMT.lib(sbheap.obj)
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __get_amblksiz already defined in LIBCMT.lib(sbheap.obj)......

我该如何解决? 感谢。

6 个答案:

答案 0 :(得分:20)

您正在混合VS运行时 - 确保项目和链接到的所有库的“项目属性/ C ++ /代码生成/运行时库”设置相同。

答案 1 :(得分:7)

我和你有同样的问题。这个问题的原因是链接器包含了许多你看不到的库(例如你将包含 windows.h ,它包括 windef.h 等等。 )。并且因为这些文件不是防止写入的(#ifndef),所以链接器会尝试#define同样的事情而不是一次 - 问题。

我的解决方案是设置此字段: 项目属性 - >链接器 - >输入 - >忽略特定库

到" libcmt.lib "

有了这个,您的链接器将忽略也在发布配置中默认包含的有问题的库,一切都应该工作..: - )

度过美好的一天..: - )

P.S。如果您想避免这些链接器误解,请继续配置项目不在调试或发布配置中,而是在"所有配置"中。此选项位于项目配置的左上角。

答案 2 :(得分:2)

您正在链接在Debug配置中编译的.obj或.lib文件。最好的办法是确保文件也在Release模式下构建。第二个最好的方法是告诉链接器忽略链接到libcmtd.lib的请求。 Project + Properties,Linker,Input,Ignore Specific Library = libcmtd.lib。但是,如果你在尝试之后无法获得.lib的Release版本,那么只能这样做。

答案 3 :(得分:1)

您可以删除预处理器定义“DEBUG”来解决您的问题

答案 4 :(得分:1)

我遇到了类似的问题,这与你是否包含使用右端状态构建的库有关。如果在发布模式下构建程序并指向以调试模式编译的* .lib文件。它会给你符号错过匹配错误。特别是如果您的程序在调试模式下构建罚款或反之亦然。

这可能不完全是你的问题,但对于遇到与我相同的事情的人来说,这是一个很好的信息。

答案 5 :(得分:0)

您可能已在“调试”配置中定义了所有链接信息。这意味着您需要将其重新定义为“Release”或将其移至“All Configurations”以便共享。