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

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

本文关键字:符号 外部 LIBCMT 其他 冲突      更新时间:2023-10-16

我有一个使用OpenGL 3.2(+lib)和FreeType2的程序。然后是Boost和OpenSSL的另一个程序。OpenGL方面是确保文本可以渲染,boost/openssl程序是做一个安全的登录/游戏服务器。

两个程序都可以很好地工作。

然而,在游戏(GL + freetype)项目中添加Boost和OpenSSL导致它无法链接。

我已经链接了下面的库,并包含了其中的includes文件夹。

glimg.libglutil.libglfw.libopengl32.libfreetype.libglew32.libuser32.liblibeay32.libssleay32.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

Runtime Library设置为多线程DLL (/MD)

我不知道该怎么办,我将非常感谢你的帮助。

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

当编译器生成引用外部定义的对象或函数的代码,而链接器未能找到它们时,会产生未解析的外部错误消息。要生成调用函数调用的代码,编译器只需要一个声明:

extern "C" BOOL DeregisterEventSource ( HANDLE hEventLog );

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

Windows API调用很容易在错误日志中被发现。它们有一个__imp__前缀,有时有一个AW后缀,后面跟着@<n>,其中表示参数所需的字节数。在Windows API调用的情况下,您可以在MSDN中查找该函数(如DeregisterEventSource)。底部是Requirements,您可以在其中找到导入库名称。

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

相关文章: