C++ Связывание ошибок с использованием сторонней библиотеки

Кажется, на этот вопрос есть куча похожих вопросов, но все они, кажется, ответили, которые не связаны с тем, что я делаю.

Я работаю над проектом C++ с использованием Ogre3D более года, и сейчас я пытаюсь добавить поддержку воспроизведения видео. Я нашел подходящую библиотеку, которая использует ogre и ffmpeg для воспроизведения видео, которые я сейчас пытаюсь включить в нашу систему сборки. Проект использует Mingw и Cmake.

Мне удалось скомпилировать видео библиотеку ( https://github.com/scrawl/ogre-ffmpeg-videoplayer), и мне удалось связать ее просто отлично с моим проектом.

Проблема возникает во время компоновки основного проекта, он жалуется на неопределенные ссылки на основные функции людоедов, с которыми мы хорошо работали раньше. Он указывает на строки кода в новой библиотеке видео, где происходит сбой ссылки.

Библиотека видео использует ogre и ffmpeg, изначально я получил неопределенные ссылки на функции ffmpeg, но после того, как удалось связать библиотеки 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). The 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.

Кто-нибудь может определить, что я могу делать неправильно, и что я мог бы попытаться исправить?

Спасибо!

1 ответ

Решение

Мне удалось это решить.

Переупорядочиваем список библиотек для ссылки в команде target_link_libraries таким образом, чтобы новая библиотека видео была включена до того, как ogre, кажется, решил мою проблему.

Я приму свой ответ через 6 часов

Другие вопросы по тегам