Кажется, есть куча подобных вопросов, но все они, кажется, ответили, что не связаны с тем, что я делаю.
Я работаю над проектом на 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). Файл cmakelists.txt: http://pastebin.com/LVsJtxny.
Вот журнал компиляции из видеотеки: http://pastebin.com/k3jLiL09 и cmakelists.txt: https://github.com/scrawl/ogre-ffmpeg-videoplayer/blob/master/CMakeLists.txt
Сначала я подумал, что, возможно, проблема была в том, что компиляция видеотеки не связана с людоедом, поскольку команды g++ не упоминают людоеда, но cmakelists.txt, кажется, в порядке (я подтверждаю, что он находит людоеда и что людоед включен в список). target_link_libraries)
Моя вторая мысль заключается в том, что, возможно, они ссылаются на разные версии ogre, но этого не может быть, поскольку они оба находят одну и ту же установку ogre и одни и те же библиотеки ogre.
Кто-нибудь может определить, что я могу делать неправильно, и что я могу попытаться исправить?
Спасибо!
g++
имеет большое значение. - person Basile Starynkevitch   schedule 01.09.2015