提问人:Andrew 提问时间:1/4/2013 最后编辑:IInspectableAndrew 更新时间:1/4/2013 访问量:47322
“LIBCMT”与其他库 + 未解析的外部符号的使用冲突
'LIBCMT' conflicts with use of other libs + unresolved external symbols
问:
我有一个使用 OpenGL 3.2(+libs) 和 FreeType2 的程序。然后是另一个带有 Boost 和 OpenSSL 的程序。OpenGL 方面是确保文本可以呈现,而 boost/openssl 程序是做一个安全的登录/游戏服务器。
这两个程序都可以由他们自己运行良好。
但是,将 Boost 和 OpenSSL 添加到游戏(GL + freetype)项目中导致其无法链接。
我已经链接了以下库以及包括包含文件夹。
glimg.lib 文件 glutil.lib 文件 glfw.lib opengl32.lib freetype.lib glew32.lib 用户32.lib libeay32.lib ssleay32.lib
链接器错误是。
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__DeregisterEventSource@4
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__ReportEventA@36
1>libeay32.lib(cryptlib.obj) : error LNK2001: unresolved external symbol __imp__RegisterEventSourceA@8
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__DeleteDC@4
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__DeleteObject@4
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetBitmapBits@12
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__BitBlt@36
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetObjectA@12
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__SelectObject@8
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateCompatibleBitmap@12
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__GetDeviceCaps@8
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateCompatibleDC@4
1>libeay32.lib(rand_win.obj) : error LNK2001: unresolved external symbol __imp__CreateDCA@16
1>.\BasicTexture.exe : fatal error LNK1120: 13 unresolved externals
运行时库设置为多线程 DLL (/MD)
我不知道该怎么办,我真的很感激任何帮助。
答:
您正在尝试使用 进行编译,这可能是正确的选择,但是某些代码(可能是其中一个库)是使用 构建的,并且您不能在同一个程序中同时使用这两种方式。您需要弄清楚是用哪个库构建的,然后用 重建它。/MD
/MT
/MT
/MD
评论
/MT
当编译器生成引用外部定义的对象或函数的代码,并且链接器无法找到这些对象或函数时,将生成无法解析的外部错误消息。若要生成调用函数调用的代码,编译器只需要一个声明:
extern "C" BOOL DeregisterEventSource ( HANDLE hEventLog );
这些信息足以生成指令(目标地址除外)。关键字通知编译器实现是在其他地方定义的。因此,它无法知道以后必须填写的目标地址。编译器完成后,链接器的工作是将各个部分连接在一起。它使用从导入库收集的信息来查找所需的偏移量。call
extern
在错误日志中很容易发现 Windows API 调用。它们有一个前缀,有时还有一个 or 后缀,后跟 <n> 表示参数所需的字节数。对于 Windows API 调用,可以在 MSDN 中查找该函数(如 DeregisterEventSource)。底部是“要求”,您可以在其中找到导入库名称。__imp__
A
W
@<n>
冲突警告指示并非所有模块都使用相同的运行时库。尽管这只是一个警告,但它是一个严重的问题,应该得到解决。如果混合使用和编译器开关,则会收到此警告,但是,如果混合使用发布和调试运行时库(如 和 )。若要诊断此消息,可以使用 /VERBOSE:LIB
链接器开关来确定链接器正在搜索哪些库。有关此警告的其他信息,请访问此 MSDN 链接。/MD
/MT
/MD
/MDd
评论
上一个:未解析的外部
评论
Advapi32.lib
Gdi32.lib