c – ‘LIBCMT’与使用其他libs未解决的外部符号冲突

前端之家收集整理的这篇文章主要介绍了c – ‘LIBCMT’与使用其他libs未解决的外部符号冲突前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个使用OpenGL 3.2(libs)和FreeType2的程序.然后另一个程序与Boost和OpenSSL. OpenGL的一面是确保文本可以呈现,并且boost / openssl程序是做一个安全的登录/游戏服务器.

两个方案都可以通过他们自己的工作.

然而,将Boost和OpenSSL添加到游戏(GL freetype)项目中导致无法链接.

我已经链接了以下libs以及其中包含的文件夹.

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)

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

解决方法

当编译器生成引用外部定义的对象或函数代码时,会产生未解决的外部错误消息,并且链接器无法找到这些对象.为了生成调用函数代码,编译器只需要一个声明:
extern "C" BOOL DeregisterEventSource ( HANDLE hEventLog );

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

Windows API调用很容易被发现在错误日志中.他们有一个__imp__前缀,有时候是一个A或W后缀,后跟@< n>其中< n>指示参数所需的字节数.在Windows API调用的情况下,您可以查看MSDN中的功能(如DeregisterEventSource).最底层的是要求,您可以在其中找到导入库名称.

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

原文链接:https://www.f2er.com/c/115590.html

猜你在找的C&C++相关文章