MSVC与CRT默认库链接冲突问题

300 篇文章 0 订阅
211 篇文章 3 订阅

MFC程序在将MFC的使用方式从<Use MFC in a Static Library>切换到<Use MFC in a Shared Library>,构建时,经常出现如下所示nafxcwd.lib、MSVCRTD.lib、LIBCMTD.lib几个lib库冲突问题。

>nafxcwd.lib(afxmem.obj) : error LNK2005: “void * __cdecl operator new(unsigned int)” (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new.obj) 中定义
>nafxcwd.lib(afxmem.obj) : error LNK2005: “void __cdecl operator delete(void *)” (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(dbgdel.obj) 中定义
……
>MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: _sprintf 已经在 libcmtd.lib(sprintf.obj) 中定义
>MSVCRTD.lib(MSVCR90D.dll) : error LNK2005: _strncmp 已经在 LIBCMTD.lib(strncmp.obj) 中定义
……
>LINK : warning LNK4098: 默认库“MSVCRTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
>F:\…\RtspClient.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

今天又碰到这个问题了,于是写下来。

这个问题是在修改主程序“Use of MFC”选项的时候引起的,主程序引用了其他几个lib库。lib库的配置是<Static Library(.lib)>、<Use Standard Windows Libraries>、代码生成使用的运行库是<Multi-threaded Debug DLL (/MDd)>,主程序修改后的配置是<Application(.exe)>、<Use MFC in a Static Library>、代码生成使用的运行库是<Multi-threaded Debug (/MTd)>。

要解决这个问题,首先要了解MSVCRTD.lib、LIBCMTD.lib干什么用的,还有MSVC与CRT的关系,可以通过这篇文章了解:MSVC与CRT的恩怨情仇

了解以后,可以采用下面的方法解决问题。

  1. 将lib库使用的运行库一致修改为<Multi-threaded Debug (/MTd)>;
  2. 由于VS在编译时是按文件名字母序的顺序,同时按需决定要链接的库文件,这里我们强制修改链接顺序。在 配置属性->连接器->输入 中,忽略特定库:nafxcwd.lib;libcmtd.lib,附加依赖项:nafxcwd.lib libcmtd.lib。

这样,构建成功。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值