libcpmtd.lib error

今天编译一个利用静态库(NeHeGL.lib)的项目(example1.exe)时,碰到如下warning和error:

warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;

libcpmtd.lib(xdebug.obj) : error LNK2019: 无法解析的外部符号 __malloc_dbg

libcpmtd.lib(xdebug.obj) : error LNK2019: 无法解析的外部符号 __free_dbg

libcpmtd.lib(stdthrow.obj) : error LNK2019: 无法解析的外部符号 __CrtDbgReportW

经过反复试验发现如下有关情况:
当NeHeGL.lib选择Release编译,运行时库选择MT, 生成的库文件为679k, example1.exe选择Release编译,运行库选择MT,没有警告,也没有error。
但是如果example1.exe选择Debug编译,运行库选择MT,就会出现上面的警告和错误。
如果example1.exe选择Debug编译,运行库选择MTd,就会有警告而没有错误。
如果NeHeGL.lib选择Debug编译,运行时库选择MTd,生成的库文件为2784k,example1.exe选择Debug编译,运行库选择MTd,没有警告,也没有error。
如果example1.exe选择Debug编译,运行库选择MT,则会出现如下错误和警告
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __heap_alloc 已经在 LIBCMT.lib(malloc.obj) 中定义
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __recalloc 已经在 LIBCMT.lib(recalloc.obj) 中定义
1>LIBCMTD.lib(dbgheap.obj) : error LNK2005: __msize 已经在 LIBCMT.lib(msize.obj) 中定义
1>LIBCMTD.lib(malloc.obj) : error LNK2005: _V6_HeapAlloc 已经在 LIBCMT.lib(malloc.obj) 中定义
1>LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook 已经在 LIBCMT.lib(dbghook.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __get_sbh_threshold 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __set_sbh_threshold 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __set_amblksiz 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: __get_amblksiz 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_heap_init 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_find_block 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_free_block 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_alloc_block 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_alloc_new_region 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_alloc_new_group 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_resize_block 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_heapmin 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_heap_check 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(sbheap.obj) : error LNK2005: ___sbh_pHeaderDefer 已经在 LIBCMT.lib(sbheap.obj) 中定义
1>LIBCMTD.lib(isctype.obj) : error LNK2005: __isctype_l 已经在 LIBCMT.lib(isctype.obj) 中定义
1>LIBCMTD.lib(isctype.obj) : error LNK2005: __isctype 已经在 LIBCMT.lib(isctype.obj) 中定义
1>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>LINK : warning LNK4098: 默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

结论是:lib文件和exe文件的编译选项(Debug/Release)和运行库(MT/MTd)应该保持一致,否则会出现莫名其妙的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值