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

时间:2013-01-03 23:23:03

标签: c++ visual-studio-2010 linker-errors unresolved-external linker-warning

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

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

2 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:21)

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

extern "C" BOOL DeregisterEventSource ( HANDLE hEventLog );

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

在错误日志中很容易发现Windows API调用。他们有__imp__前缀,有时还有AW后缀,后跟@<n>,其中&lt; n&gt; 表示所需的字节数争论。对于Windows API调用,您可以在MSDN中查找该函数(如DeregisterEventSource)。接下来是 Requirements ,您可以在其中找到导入库名称。

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

相关问题