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

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

Я работаю над проектом на 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.

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

Спасибо!


person Jacob Jensen    schedule 31.08.2015    source источник
comment
Неопределенные справочные ошибки при создании (статической?) библиотеки? Это действительно странно. Можете ли вы подтвердить, что он действительно создает библиотеку, а не пытается создать исполняемый файл?   -  person Daniel Jour    schedule 01.09.2015
comment
Покажите хотя бы точные команды компиляции. Порядок аргументов для g++ имеет большое значение.   -  person Basile Starynkevitch    schedule 01.09.2015
comment
Должен ли он быть помечен CMake, поскольку make-файл для проекта библиотеки создается с использованием CMake?   -  person drescherjm    schedule 01.09.2015
comment
@DanielJour В этом процессе происходит две сборки. При сборке статической библиотеки ogre-ffmpeg-video, в которой нет реальных ошибок, и при сборке основного проекта/игры/исполняемого файла, использующего библиотеку ogre-ffmpeg-video, на этом этапе компоновки возникают ошибки. Извините, что не сделал это яснее   -  person Jacob Jensen    schedule 01.09.2015
comment
@BasileStarynkevitch Первая ссылка pastebin показывает команды g++ с аргументами, вам нужно увидеть что-нибудь еще?   -  person Jacob Jensen    schedule 01.09.2015
comment
Не используйте pastebin, а скопируйте соответствующий код в вопросе с четырьмя пробелами перед каждой строкой.   -  person Basile Starynkevitch    schedule 01.09.2015
comment
@BasileStarynkevitch Это не код, это журнал из автоматически сгенерированных make-файлов с использованием cmake. Но я добавил команду g++ из тегов кода журнала.   -  person Jacob Jensen    schedule 01.09.2015


Ответы (1)


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

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

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

person Jacob Jensen    schedule 02.09.2015