“LIBCMT”与其他库 + 未解析的外部符号的使用冲突

'LIBCMT' conflicts with use of other libs + unresolved external symbols

提问人:Andrew 提问时间:1/4/2013 最后编辑:IInspectableAndrew 更新时间:1/4/2013 访问量:47322

问:

我有一个使用 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)

我不知道该怎么办,我真的很感激任何帮助。

C++ Visual-Studio-2010 未解决外部 链接器警告

评论

3赞 IInspectable 1/4/2013
未解析的外部问题是由于未链接到所需的库 ( 和 )。第一个警告表示您的项目和您要链接的某些库具有与 CRT 不兼容的链接器设置。除此之外,您似乎没有编译 Unicode 版本。这是有原因的吗?Advapi32.libGdi32.lib
0赞 Andrew 1/4/2013
谢谢蒂姆。不确定 unicode 的东西,我只是使用 premake4 来制作 vs solition 并更改了我需要的任何内容(我为 unicode 选择了 yes)。你希望它成为一个答案,因为你已经修复了它!生成成功。谢谢!:)

答:

34赞 Adrian McCarthy 1/4/2013 #1

您正在尝试使用 进行编译,这可能是正确的选择,但是某些代码(可能是其中一个库)是使用 构建的,并且您不能在同一个程序中同时使用这两种方式。您需要弄清楚是用哪个库构建的,然后用 重建它。/MD/MT/MT/MD

评论

2赞 AShelly 1/4/2013
或者,如果您没有罪魁祸首库的源代码,请将您的项目与/MT
0赞 Andrew 1/4/2013
感谢您的回复,蒂姆在大约一个小时的问题评论中解决了这个问题。我想给他答案:接受。但是 +1。因为在发布问题之前,我确实检查了所有内容是否都经过了 MD 线程。
31赞 IInspectable 1/4/2013 #2

当编译器生成引用外部定义的对象或函数的代码,并且链接器无法找到这些对象或函数时,将生成无法解析的外部错误消息。若要生成调用函数调用的代码,编译器只需要一个声明:

extern "C" BOOL DeregisterEventSource ( HANDLE hEventLog );

这些信息足以生成指令(目标地址除外)。关键字通知编译器实现是在其他地方定义的。因此,它无法知道以后必须填写的目标地址。编译器完成后,链接器的工作是将各个部分连接在一起。它使用从导入库收集的信息来查找所需的偏移量。callextern

在错误日志中很容易发现 Windows API 调用。它们有一个前缀,有时还有一个 or 后缀,后跟 <n> 表示参数所需的字节数。对于 Windows API 调用,可以在 MSDN 中查找该函数(如 DeregisterEventSource)。底部是“要求”,您可以在其中找到导入库名称。__imp__AW@<n>

冲突警告指示并非所有模块都使用相同的运行时库。尽管这只是一个警告,但它是一个严重的问题,应该得到解决。如果混合使用和编译器开关,则会收到此警告,但是,如果混合使用发布和调试运行时库(如 和 )。若要诊断此消息,可以使用 /VERBOSE:LIB 链接器开关来确定链接器正在搜索哪些库。有关此警告的其他信息,请访问此 MSDN 链接/MD/MT/MD/MDd

评论

3赞 riderBill 10/18/2015
+1 表示 imp 前缀表示 Windows API 调用。我以前在链接器错误中看到过该前缀,但不知道为什么它以符号为前缀。