链接错误:error LNK2019:无法解析的外部符号 __CrtDbgReportW——库冲突(libcmt.lib和libcmtd.lib)
2014-05-13 15:36
1581 查看
error LNK2019: 无法解析的外部符号
这种情况一般都是函数只找到声明但没有实现,或者是少了链接库1.看看声明和函数定义是否一致
2.看看工程是否包含.h .cpp文件
3.查找是否缺少定义该函数的链接,库
在VC2008中调试一个可执行文件时代码生成通过,但是连接时编译器报错:
1>正在链接...
1> 正在创建库 .\Debug/djzdt.lib 和对象 .\Debug/djzdt.exp
1>djzdt.exp : warning LNK4070: .EXP 中的 /OUT:cassdjzdt.dll 指令与输出文件名“D:\djzdt.arx”不同;忽略指令
1>atlsd.lib(Externs.obj) : error LNK2019: 无法解析的外部符号 __CrtDbgReportW,该符号在函数 "void __stdcall ATL::AtlThrowImpl(long)" (?AtlThrowImpl@ATL@@YGXJ@Z)
中被引用
1>atlsd.lib(AtlDebugAPI.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>atlsd.lib(Allocate.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>atlsd.lib(AtlTraceModuleManager.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>atlsd.lib(Externs.obj) : error LNK2019: 无法解析的外部符号 __CrtDbgReport,该符号在函数 "void __cdecl `dynamic initializer for 'public: static class ATL::CTrace ATL::CTrace::s_trace''(void)"
(??__E?s_trace@CTrace@ATL@@2V12@A@@YAXXZ) 中 被引用
1>atlsd.lib(AtlTraceModuleManager.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReport
1>D:\djzdt.arx : fatal error LNK1120: 2 个无法解析的外部命令
开始以为是原文件缺失可是在工程中查找CrtDbgReportW,但是没有找到源文件位置,于是上网搜,就找到了。
方法一:
最终是单线程/多线程的问题,描述如下:
运行时库现在包含可防止混合不同类型的指令。如果试图在同一个程序中使用不同类型的运行时库或使用调试和非调试版本的运行时库,则将收到此警告。例如,如果编译一个文件以使用一种运行时库,而编译另一个文件以使用另一种运行时库(例如单线程运行时库对多线程运行时库),并试图链接它们,则将得到此警告。应将所有源文件编译为使用同一个运行时库。有关更多信息,请参见使用运行时库(/MD、/MT 和 /LD)编译器选项。
解决方案:(不是很多时候不成功一个好办法!!!)
项目属性,在“配置属性-->C/C++-->代码生成-->运行时库”中将“多线程(/MT)”修改为“多线程调试(/MTd)”。
或者Project-->Properties-->Configuration
Properties--> C/C++--> Code
Generation -->Runtime Library -->Multi-threaded
(/MT) 改为 Multi-threaded Debug (/MTd)
部分参考:http://www.cnblogs.com/lgydqy/archive/2012/02/16/2353925.html
方法二:
在同一个项目中,所有的源文件必须链接相同的C运行时库。如果某一文件用了Multithreaded DLL版本,而其他文件用了Single-Threaded或者Multithreaded版本的库,也就是说用了不同的库,就会导致这个警告的出现。
参考:http://blog.csdn.net/redline2005/article/details/6313703
lib之间有冲突。需要删除导入的一些libs。
版 本 | 类 型 | 使用的library | 被忽略的library |
R Release | 单线程 | 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 | |
D Debug | 单线程 | libcd.lib | libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib |
多线程 | libcmtd.lib | libc.lib, libcmt.lib, msvcrt.lib, libcmtd.lib, msvcrtd.lib | |
使用DLL的多线程 | msvcrtd.lib | libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib |
eg:编译Release版本的单线程的工程,在linker的命令行加入如下的参数: /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib
/NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib
如果还不行,用release版试,或者把debug版本中预编译头的_debug去掉
因为
#ifdef _DEBUG (只有debug版本才会执行这个,release不会执行所以没错,把预编译头去掉_debug肯定能过)
int _CrtDbgReportW(
int reportType,
const wchar_t *filename,
int linenumber,
const wchar_t *moduleName,
const wchar_t *format,
...
)
{
return 0;
}
#endif
///以下参考
#include <crtdbg.h>
库的话 msvcrtd.lib
最好不直接使用 _CrtDbgReport, 用 _ASSERT
在Debug模式下 _ASSERT 被定义为
?
C/C++ code
?
加上这个才能编译过。。。
相关文章推荐
- LIBCMTD.lib(wincrt0.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
- 编辑单个CPP文件,出现1>LIBCMTD.lib(crt0.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函
- libcmtd.lib(crt0.obj) : error LNK2019: 无法解析的外部符号 _main
- libcmtd.lib(crt0.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
- libcmtd.lib(crt0.obj) : error LNK2019: 无法解析的外部符号 _main
- libcpmtd.lib(xdebug.obj) : error LNK2019: 无法解析的外部符号 unresolved external symbol __malloc_dbg
- error LNK2019: 无法解析的外部符号 __imp___CrtDbgReportW
- (在hello,MFC的创建过程中,新建项目时所配置的属性出现错误)error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用 MSVCRTD.lib
- error LNK2019: 无法解析的外部符号 _CrtDbgReportW
- 项目添加UNICODE支持时,出现链接错误error LNK2019: 无法解析的外部符号 _WinMain
- error LNK2019: 无法解析的外部符号 __imp___CrtDbgReportW
- glaux.lib(tk.obj) : error LNK2019: 无法解析的外部符号 _sscanf,该符号在函数 _GetRegistrySysColors@8 中被引用
- MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainC
- 错误1:error LNK2019: 无法解析的外部符号 __imp__closesocket@4,该符号在函数 _wmain 中被引用
- 关于编译eMule0.48a 提示: zlib.lib(gzio.obj) : error LNK2019: 无法解析的外部符号 __imp__strerror ,该符号在函数 _gzerror 中被引用
- 错误 1 error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
- 错误 4 error LNK2019: 无法解析的外部符号 "public: __thiscall CRobotProvider::~CRobotProvider(void)" (??1CRobotP
- MSVCRTD.lib(crtexe.obj) : error LNK2019: 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStart
- c++ 链接mysql:error LNK2019: 无法解析的外部符号
- 出现error LNK2019: 无法解析的外部符号错误的诊断