使用第三方库的c++链接错误

C++ Linking errors using third party library

本文关键字:c++ 链接 错误 第三方      更新时间:2023-10-16

似乎有一堆类似的问题,但他们似乎都已经回答了与我正在做的事情无关的问题。

我已经用Ogre3D做了一年多的c++项目了,我目前正在尝试添加对播放视频的支持。我找到了一个合适的库,使用食人魔和ffmpeg来播放视频,我现在正试图将其纳入我们的构建系统。项目使用mingw和cmake.

我已经设法编译视频库(https://github.com/scrawl/ogre-ffmpeg-videoplayer),我设法将它与我的项目链接起来。

问题出现在主项目的链接过程中,它抱怨对基本的食人魔函数的未定义引用,我们之前工作得很好。它指向新视频库中出现错误引用的代码行。

视频库依赖于食人魔和ffmpeg,最初我得到了对ffmpeg函数的未定义引用,但在设法将ffmpeg库与我的主要项目链接之后,这些错误消失了,所以我不理解当前未定义的食人魔引用。

可能需要注意的一件事是,当视频库正在编译时,g++命令不引用ogre或ffmpeg,即使cmake文件在它们上调用target_link_libraries。这对我来说有点奇怪,但可能只是我缺乏对链接的理解,因为它编译得很好。

下面是包含主链接错误的完整构建日志:http://pastebin.com/X6Lbccag

从那里的违规行:

C:mingwbing++.exe   -std=c++0x -msse2 -Wno-unused-function -g    -Wl,--whole-archive CMakeFilesRunTests.dir/objects.a -Wl,--no-whole-archive  -o RunTests.exe -Wl,--out-implib,libRunTests.dll.a -Wl,--major-image-version,0,--minor-image-version,0  libThrive.a contribgoogletestlibgtest_main.a C:mingwinstallliblibboost_thread-mt.dll C:mingwinstallliblibboost_date_time-mt.dll C:mingwinstallliblibboost_system-mt.dll C:mingwinstallliblibboost_chrono-mt.dll C:mingwinstallliblibboost_filesystem-mt.dll C:mingwOgreSDKlibDebuglibOgreMain_d.dll.a C:mingwinstallliblibboost_thread-mt.dll C:mingwinstallliblibboost_date_time-mt.dll C:mingwinstallliblibboost_system-mt.dll C:mingwinstallliblibboost_chrono-mt.dll C:mingwinstallliblibboost_filesystem-mt.dll C:mingwOgreSDKlibDebuglibOgreMain_d.dll.a C:mingwOgreSDKlibDebuglibOIS_d.dll.a C:mingwinstallliblibBulletDynamics_Debug.a C:mingwinstallliblibBulletCollision_Debug.a C:mingwinstallliblibLinearMath_Debug.a C:mingwinstallliblibBulletSoftBody_Debug.a C:mingwinstallliblibCEGUIBase-9999_d.dll.a C:mingwinstallliblibCEGUIOgreRenderer-9999_d.dll.a C:mingwinstallliblibtinyxml.a C:mingwinstalllibDebuglibogre-ffmpeg-videoplayer.a C:mingwinstallliblibavcodec.dll.a C:mingwinstallliblibavformat.dll.a C:mingwinstallliblibavutil.dll.a C:mingwinstallliblibswscale.dll.a C:mingwinstallliblibswresample.dll.a contribluabindsrclibluabind.a contriblualiblua.dll.a -lm C:mingwinstallbinlibcAudio.dll contribgoogletestlibgtest.a -lpthread -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
C:mingwinstalllibDebuglibogre-ffmpeg-videoplayer.a(videostate.cpp.obj): In function `ZN5Video10VideoState4initERKSs':
C:/mingw/temp/ffmpeg/ogre-ffmpeg-videoplayer-master/src/videostate.cpp:617: undefined reference to `Ogre::ResourceGroupManager::openResource(std::string const&, std::string const&, bool, Ogre::Resource*)'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[2]: *** [RunTests.exe] Error 1
mingw32-make.exe[1]: *** [CMakeFiles/RunTests.dir/all] Error 2
mingw32-make.exe: *** [all] Error 2

你会注意到libOgreMain_d.dll。a在失败命令中被链接,该命令包含引用的Ogre::ResourceGroupManager::openResource函数(我通过在半打乱的libOgreMain_d.dll.a中找到该函数来确认这一点)。cmakelists.txt: http://pastebin.com/LVsJtxny

这是视频库中的编译日志:http://pastebin.com/k3jLiL09它是cmakelists.txt: https://github.com/scrawl/ogre-ffmpeg-videoplayer/blob/master/CMakeLists.txt

我的第一个想法是,也许问题是在视频库编译没有链接到ogre,因为g++命令没有提到ogre,但cmakelists.txt似乎很好(我确认它找到了ogre, ogre包含在target_link_libraries中)

我的第二个想法是,也许它们链接到不同版本的ogre,但这是不可能的,因为它们都找到了相同的ogre安装和相同的ogre库。

有人能发现我可能做错了什么,我可以试着解决这个问题吗?

谢谢!

我终于解决了。

在target_link_libraries命令中重新排序要链接的库列表,以便在ogre之前包含新的视频库,似乎已经解决了我的问题。

我会在6小时内接受我自己的答案