一、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”不能勾选。