24

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

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

4

2 回答 2

30

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

于 2013-01-04T00:47:01.610 回答
27

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

extern "C" BOOL DeregisterEventSource ( HANDLE hEventLog );

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

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

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

于 2013-01-04T13:33:41.873 回答