【发布时间】:2015-08-31 23:34:35
【问题描述】:
似乎有一堆与此类似的问题,但他们似乎都回答了与我正在做的事情无关的问题。
一年多以来,我一直在使用 Ogre3D 开发 C++ 项目,目前我正在尝试添加对播放视频的支持。我找到了一个合适的库,它使用 ogre 和 ffmpeg 来播放我现在正试图合并到我们的构建系统中的视频。项目使用 mingw 和 cmake。
我已经成功编译了视频库 (https://github.com/scrawl/ogre-ffmpeg-videoplayer),并且成功地将它与我的项目链接。
问题出现在主项目的链接过程中,它抱怨对我们之前工作正常的基本 Ogre 函数的未定义引用。它指向新视频库中发生失败引用的代码行。
视频库依赖于 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 中找到该函数来确认这一点。一种)。 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 库。
是否有人能够发现我可能做错了什么以及我可以尝试解决问题的方法?
谢谢!
【问题讨论】:
-
构建(静态?)库时出现未定义的引用错误?这真的很奇怪。你能确认它真的是在构建一个库而不是试图创建一个可执行文件吗?
-
至少显示准确的编译命令。
g++的参数顺序非常重要。 -
由于库项目的 makefile 是使用 CMake 生成的,因此是否应该使用 CMake 进行标记?
-
@DanielJour 在这个过程中有两个构建正在进行。构建没有实际错误的静态 ogre-ffmpeg-video 库,并构建使用 ogre-ffmpeg-video 库的主项目/游戏/可执行文件,在此链接步骤期间会发生错误。很抱歉没有说得更清楚
-
@BasileStarynkevitch 第一个 pastebin 链接显示了带有参数的 g++ 命令,您还需要查看其他内容吗?
标签: c++ linker cmake shared-libraries ogre3d