运行时库冲突

23 篇文章 0 订阅

为什么会链接的时候会导致库冲突

例如:

LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突请使用 /NODEFAULTLIB:library

主要原因就是你链接程序的时候,你同时链接了多个运行库,所以出现这个提示。

对于很多windows提供的库,都包含两个版本:静态链接版本,动态链接版本。

链接模式:Debug模式,Release模式。由于宏定义的不同,造成预处理的结果差别非常大。

对于windows提供的库,我们可以修改链接选项,链接不同的库(静态的,动态的)。

但是对于我们自己做的库,一般都是提供一个版本,无论程序怎么改变编译选型,链接我们库的时候,都是根据我们提供的库决定的。

链接模式(自身冲突):

链接程序的时候有两种模式:Debug模式和Release模式。

在Debug模式默认使用的运行时库是: libcmtd.lib:MTD,msvertd.lib:MDD;(由于定义了_DEBUG,所以调用的很多函数都不一样)

在Release模式默认使用的库是:libcmt.lib:MT, msvert.lib:MD;

但是由于在Debug模式选用非Debug库,或者在Release模式选用非Release库,都会造成库冲突。

外部冲突:

当我们链接提供的静态库时候,在我们的项目使用一种运行时库,在链接库中使用另一种链接库,那么将会产生库冲突。解决方案:在所有的源码中,使用同一种链接方式。

在编程的时候,我们需要导入某些库的时候,可以这样:

#ifdef _DEBUG
#pragma comment(lib,"../Debug/Detours.lib")
#else
#pragma comment(lib,"../Release/Detours.lib")
#endif

MFC的使用

下面有三个选项分别是:

使用标准windows库:代表编译器不会默认为你链接MFC库,如果你用到MFC函数你需要手动指定你所调用的库。

共享MFC库:编译器会默认为你链接静态导入库,在运行时动态加载某些dll,但这会造成在默写机器上无法运行:缺少***.dll的问题,解决方案:把需要的库拷入系统目录。

静态链接:把所需要的库全部链接到程序内,会造成程序体积变大,不过可以在没有MFC库的机器上完美运行。

Maybe useful to you

http://www.cnblogs.com/eddyshn/archive/2009/11/23/1608823.html

///get from net

下表显示根据要使用的运行时库应忽略的库。

若要使用此运行时库 请忽略这些库 
单线程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 
多线程/MT (libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 
使用 DLL 的多线程/MTD (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib 
调试单线程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib 
调试多线程/MTd (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib 
使用DLL的调试多线程/MDd (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib
例如,如果收到此警告,并希望创建使用非调试、单线程版本的运行时库的可执行文件,可以将下列选项与链接器一起使用:

/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值