您的位置:首页 > Web前端 > Node.js

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

2017-12-12 15:46 381 查看
1>LIBCMT.lib(invarg.obj) : error LNK2005: __pInvalidArgHandler 已经在 LIBCMTD.lib(invarg.obj) 中定义

1>LIBCMT.lib(invarg.obj) : error LNK2005: _initp_misc_invarg 已经在 LIBCMTD.lib(invarg.obj) 中定义

1>LIBCMT.lib(invarg.obj) : error LNK2005: _call_reportfault 已经在 LIBCMTD.lib(invarg.obj) 中定义

1>LIBCMT.lib(invarg.obj) : error LNK2005: _set_invalid_parameter_handler 已经在 LIBCMTD.lib(invarg.obj) 中定义

1>LIBCMT.lib(invarg.obj) : error LNK2005: _get_invalid_parameter_handler 已经在 LIBCMTD.lib(invarg.obj) 中定义

1>LIBCMT.lib(invarg.obj) : error LNK2005: _invoke_watson 已经在 LIBCMTD.lib(invarg.obj) 中定义

1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned __int64)" (?_invoke_watson@@YAXPEBG00I_K@Z) 已经在 LIBCMTD.lib(invarg.obj) 中定义

1>LIBCMT.lib(invarg.obj) : error LNK2005: _invalid_parameter 已经在 LIBCMTD.lib(invarg.obj) 中定义

1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned __int64)" (?_invalid_parameter@@YAXPEBG00I_K@Z) 已经在 LIBCMTD.lib(invarg.obj) 中定义

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

1>D:\CPS_Project\CPS\src\fis\sclServer\x64\Release\sclServer.exe : fatal error LNK1169: 找到一个或多个多重定义的符号

解决方法

属性=》配置属性=》输入=》忽略特定库LIBCMT

解决方法:

  工程右键 “属性”->“配置属性”-> “C/C++”-> “代码生成” ->  “ 运行库” 选项 设置成“多线程 (/MT)”即可

解决方法:

编译工具:VS2008

项目--〉属性--〉配置属性--〉链接器--〉输入--〉附加依赖项--〉Nafxcwd.lib Libcmtd.lib

项目--〉属性--〉配置属性--〉链接器--〉输入--〉忽略特定库--〉Nafxcwd.lib;Libcmtd.lib

若有如下警告:

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

请注意忽略特定库中二个库之间是否少了分号,如:Nafxcwd.lib;Libcmtd.lib,然后重新生成就没有这个警告了。若是Nafxcwd.lib Libcmtd.lib,就会报这个错误。

截图如下:

 



PS:以上错误原因是由于这二个库有各自的new和delete,这是冲突的,需要指定顺序。正确加载库的顺序是Nafxcwd.lib Libcmtd.lib,而默认的是Libcmtd.lib  Nafxcwd.lib。

所以就会报出上面的那个error。

    在VS2008之IVF11下调用其他库的时候有如下警告:



 

1>Linking...
1>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
1>Embedding manifest...
1>

    虽然只是一个警告,在QQ群里咨询了一下,有些人建议忽略不管,也有人给出C++的解决方案VS2008解决“MSVCRT”与其他库的使用冲突的警告 ,这里针对Fortran也相似的给出解决方案。
   项目----项目属性-----配置属性------链接器----- 命令行” 添加:  /NODEFAULTLIB:"libcmt.lib"



 

    如此之后,警告消失!

以前经常遇到这个警告信息,因为运行并没有什么问题,所以也没深究。但是耿耿于怀那个“ 0 个错误,0 个警告”的成功提示,在网上搜了一下。原来问题出在默认库的引用选择上。

VS2008,项目——属性——配置属性——C/C++——代码生成:他有/MT,/MTd,/Md,/MDd四个选项,你必须让所有使用的库都使用相同的配置,否则就会有相应的提示,甚至可能会出现无法解析的函数。有时我们使用的库不是自己可以控制的,那么就只能把工程属性设置成河你使用的库相同的选项。

错误 1 error LNK2005: _free 已经在 libcmtd.lib(dbgheap.obj) 中定义         MSVCRT.lib

错误 2 error LNK2005: _malloc 已经在 libcmtd.lib(dbgheap.obj) 中定义     MSVCRT.lib 

.....

如果有一堆的重定义错误发生在同一个lib中,而且跟它冲突的也是同一个lib,那么这个两个lib的功能应该是一样的,可以2选一,只要在“忽略特定的库”内填入需要忽略的库。

项目属性-配置属性-链接器-输入-忽略特定的库:libcmtd.lib

项目属性-配置属性-常规-MFC的使用:在共享 DLL 中使用 MFC

MSVCRT.lib 和libcmt.lib的冲突还是比较常见的。

从错误信息可以看出是msvcrt.lib和libcmt.lib库中重复定义了__isctype等符号。为什么会出现这样的问题呢?这就要从这两个库的作用说起了。

msvcrt.lib是VC中的Multithreaded DLL 版本的C运行时库,而libcmt.lib是Multithreaded的运行时库。在同一个项目中,所有的源文件必须链接相同的C运行时库。如果某一文 件用了Multithreaded DLL版本,而其他文件用了Single-Threaded或者Multithreaded版本的库,也就是说用了不同的库,就会导致这个警告的出现。

告警信息的意思我们明白之后,就要找造成这个问题的原因了。在项目设置中我们可以看到当前项目使用的是Multithreaded非DLL版本的运 行时库,这说明项目中还有其他文件用到了不是这个版本的运行时库。很显然,就是openssl的静态库。查看openssl中ms下的nt.mak,我们 可以发现静态库版本中openssl使用编译开关/MD进行编译的,也就是说openssl静态库是默认用的Multithreaded DLL 版本的C运行时库。

原因找到了。那么解决方法,很明显有两个。总之就是将两个项目的运行时库统一。

简单的方式就是将项目的动态库修改为使用Multithreaded DLL 版本的C运行时库即可。 

某些情况下你的项目可能不能改变当前的运行时库,你可以将openssl的nt.mak中的/MD开关修改为/MT然后重新编译openssl静态库就可以了。

默认库“library”与其他库的使用冲突;请使用 /NODEFAULTLIB:library LNK4098 的解决办法

您试图与不兼容的库链接。 

注意 

运行时库现在包含可防止混合不同类型的指令。如果试图在同一个程序中使用不同类型的运行 时库或使用调试和非调试版本的运行时库,则将收到此警告。例如,如 果编译一个文件以使用一种运行时库,而编译另一个文件以使用另一种运行时库(例如单线程运行时库对多线程运行时库),并试图链接它们,则将得到此警告。应 将所有源文件编译为使用同一个运行时库。有关更多信息,请参见使用运行时库(/MD、/MT 和 /LD)编译器选项。 

可以 使用链接器的 /VERBOSE:LIB 开关来确定链接器搜索的库。如果收到 LNK4098,并想创建使用如单线程、非调试运行时库的可执行文件,请使用 /VERBOSE:LIB 选项确定链接器搜索的库。链接器作为搜索的库输出的应是 LIBC.lib,而非 LIBCMT.lib、MSVCRT.lib、LIBCD.lib、LIBCMTD.lib 和 MSVCRTD.lib。对每个要忽略的库可以使用 /NODEFAULTLIB,以通知链接器忽略错误的运行时库。 

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

若要使用第一行运行时库    请忽略第2行的这些库 

单线程 (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:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib

 warning LNK4099:

在工程属性页 配置 debug 平台 活动(win32)设置:
配置属性 -> 链接器 -> 调试 -> 生成调试信息 -> 否

转自:http://blog.csdn.net/bat67/article/details/52792256
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐