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

标签 c++ linker cmake shared-libraries ogre3d

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

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

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

问题出现在主项目的链接过程中,它提示对我们之前工作正常的基本 ogre 函数的 undefined reference 。它指向新视频库中发生引用失败的代码行。

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

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

这是包含主要链接错误的完整构建日志: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 中找到该函数来确认这一点。 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 小时内接受我自己的回答

关于使用第三方库的 C++ 链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32321453/

相关文章:

通过在寄存器中传递函数地址从 asm 文件调用 C 函数

python - 管理OpenCV python Cmake Studio Windows

c++ - 为什么 i(f)stream 不能读取 double

c - 读取 elf 结构给出零值

c++ - LLVM (3.5+) PassManager 与 LegacyPassManager

Swift 3 单元测试 - 使用 import @testable 时链接器失败

c++ - 在 Windows 上使用 cmake 编译 64 位 qt(来自源代码)

cmake - cmake中的“c”代表什么?

c++ - 为什么我不能让我的 CDatabase 对象理解我的数据源名称?

c++ - decltype 在函数参数中的使用