C ++使用第三方库链接错误

时间:2015-08-31 23:34:36

标签: c++ linker cmake shared-libraries ogre3d

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

我一直在使用Ogre3D开发C ++项目超过一年,我目前正在尝试添加对播放视频的支持。我发现了一个合适的库,它使用ogre和ffmpeg来播放我现在正在尝试合并到构建系统中的视频。 Project使用mingw和cmake。

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

在主要项目的链接过程中出现问题,它抱怨我们之前工作正常的基本食人魔功能的未定义引用。它指向新视频库中发生失败引用的代码行。

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

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

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

来自那里的违规行:

C:\mingw\bin\g++.exe   -std=c++0x -msse2 -Wno-unused-function -g    -Wl,--whole-archive CMakeFiles\RunTests.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 contrib\googletest\libgtest_main.a C:\mingw\install\lib\libboost_thread-mt.dll C:\mingw\install\lib\libboost_date_time-mt.dll C:\mingw\install\lib\libboost_system-mt.dll C:\mingw\install\lib\libboost_chrono-mt.dll C:\mingw\install\lib\libboost_filesystem-mt.dll C:\mingw\OgreSDK\lib\Debug\libOgreMain_d.dll.a C:\mingw\install\lib\libboost_thread-mt.dll C:\mingw\install\lib\libboost_date_time-mt.dll C:\mingw\install\lib\libboost_system-mt.dll C:\mingw\install\lib\libboost_chrono-mt.dll C:\mingw\install\lib\libboost_filesystem-mt.dll C:\mingw\OgreSDK\lib\Debug\libOgreMain_d.dll.a C:\mingw\OgreSDK\lib\Debug\libOIS_d.dll.a C:\mingw\install\lib\libBulletDynamics_Debug.a C:\mingw\install\lib\libBulletCollision_Debug.a C:\mingw\install\lib\libLinearMath_Debug.a C:\mingw\install\lib\libBulletSoftBody_Debug.a C:\mingw\install\lib\libCEGUIBase-9999_d.dll.a C:\mingw\install\lib\libCEGUIOgreRenderer-9999_d.dll.a C:\mingw\install\lib\libtinyxml.a C:\mingw\install\lib\Debug\libogre-ffmpeg-videoplayer.a C:\mingw\install\lib\libavcodec.dll.a C:\mingw\install\lib\libavformat.dll.a C:\mingw\install\lib\libavutil.dll.a C:\mingw\install\lib\libswscale.dll.a C:\mingw\install\lib\libswresample.dll.a contrib\luabind\src\libluabind.a contrib\lua\liblua.dll.a -lm C:\mingw\install\bin\libcAudio.dll contrib\googletest\libgtest.a -lpthread -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
C:\mingw\install\lib\Debug\libogre-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中找到函数来确认这一点。一个)。 cmakelists.txt:http://pastebin.com/LVsJtxny

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

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

我的第二个想法是,他们可能会链接到不同版本的食人魔,但这不是因为他们都找到了相同的食人魔安装和相同的食人魔库。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

我设法解决了。

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

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