vc编译warning LNK4089和链接警告LNK4098解决方法

一、warning LNK4089

vc编译时Debug版本下没问题,release版本下出现如下警告:
LINK : warning LNK4089: all references to “ODBC32.dll” discarded by /OPT:REF
LINK : warning LNK4089: all references to “ADVAPI32.dll” discarded by /OPT:REF
LINK : warning LNK4089: all references to “SHELL32.dll” discarded by /OPT:REF
LINK : warning LNK4089: all references to “comdlg32.dll” discarded by /OPT:REF
解释:你没有引入xxx.dll中的任何东西,链接器做优化不再链接他,这有助于减小可知性文件的体积。
解决方法:其实不用管这种警告,如下方法可以去除警告:在project–>project setting–>link(tab)–>Project Options
最后面加上/opt:noref可去除警告。
貌似第二种警告也可以用这个方法去除。

二、warning LNK4098

LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library
你试图链接相互不兼容的库。

重要提示   目前运行时库包含预编译指令来阻止混合不同类型库的链接。如果你试图在同一个程序中使用不同类型的或者调试/非调试版本的运行时库,你将看到这个警告。举个例子,如果你编译一个文件使用某个类型的运行时库,而别的文件使用另外一个类型(例,单线程版本和多线程版本),那么在你试图链接它们的时候,你将看到这个警告。你应该使用相同的运行时库来编译所有的源文件。参阅MSDN中的Use Run-Time Library 章节了解关于(MD, /ML, /MT, /LD)编译开关的更多信息。

你可以使用链接开关/VERBOSE:LIB来了解链接器在搜索哪个库。如果你试图创建一个使用单线程非调试版本运行库的执行文件时收到LNK4098警告,那么使用/VERBOSE:LIB参数来找出链接器在搜索哪个库。链接器应该列出搜索的库LIBC.LIB,而不是LIBCMT.LIB, MSVCRT.LIB, LIBCD.LIB, LIBCMTD.LIB, 或者MSVCRTD.LIB等库。你可以通过在VC开发环境项目 Project 设置 Settings 链接Link 页面中的Ignore Libraries编辑框中输入不正确的运行时库名告诉链接器忽略这些运行时库,或者可以使用/NODEFAULTLIB:library 的链接开关来忽略那些不正确的库。参阅MSDN中 Ignore Libraries 章节了解(/NODEFAULTLIB)链接开关的更多信息。

下面的表中列出了在你选择不同运行时库时应该被忽略的库。

使用的运行时库被忽略的库
单线程 (libc.lib)libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
多线程 (libcmt.lib)libc.lib, msvcrt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
多线程DLL (msvcrt.lib)libc.lib, libcmt.lib, libcd.lib, libcmtd.lib, msvcrtd.lib
调试版单线程 (libcd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib
调试版多线程 (libcmtd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, msvcrtd.lib
调试版多线程DLL (msvcrtd.lib)libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

举例,如果你试图创建一个使用单线程非调试版运行时库的执行文件时,收到这个警告信息,你可以使用下面参数来链接:

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

当然,通过VC6.0的开发环境也可以配置。选择Project -> Setting,出现Project Setting对话框,单击Link标签,在Category下拉菜单中选择Input,在下方的Ignore libraries: 输入框中输入“被忽略的library”框中对应的libs。输入时注意当前Build是什么版本,libs之间用“,”隔开。“Ingore all default libraries”不能勾选。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值