VC中缺省库冲突的解决

http://blog.csdn.net/fmddlmyy/article/details/367333

VC在编译程序时有两个习惯:
1、在从头开始编译时(即生成makefile时),将源文件名按字母排序后,依次处理;
2、一边编译一边决定需要哪些缺省库。 它的这些习惯有时会造成奇怪的编译错误,例如项目中有两个文件:
charutil.c
gbuni.cpp
其中gbnni.cpp用到了MFC库。

编译器先处理charutil.c,然后觉得需要link一个C Runtime库,根据项目设置选择了LIBCMTD.lib。
然后又处理gbnni.cpp,因为要用MFC,又决定要link nafxcwd.lib。
最后link的时候,就会出现以下冲突:
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
其实,如果先link nafxcwd.lib,再link LIBCMTD.lib,就不会产生冲突。

解决这类问题有两个办法。
1、将需要link C Runtime库的文件(charutil.c)的名字改大一些,让它排在后面。
2、在settings->link->input的Objects/library modules中设置nafxcwd.lib LIBCMTD.lib,即指定库的顺序。也可以顺利编译。

总结一下:在发生缺省库冲突时,可以通过手工设置缺省库的顺序来解决,正确的顺序应该是:
MFC库、CRT动态链接版本的导入库、CRT静态库。
CRT是C RunTime库的缩写。

关于link过程更详细的介绍可以参见http://blog.csdn.net/soloist/archive/2005/09/30/493238.aspx,我从这篇文章中受益良多,感谢作者soloist。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值