使用第三方库的 C++ 链接错误
C++ Linking errors using third party library
似乎有一堆与此类似的问题,但他们似乎都回答了与我正在做的事情无关的问题。
一年多来我一直在使用 Ogre3D 开发 C++ 项目,目前我正在尝试添加对播放视频的支持。我找到了一个合适的库,它使用 ogre 和 ffmpeg 来播放我现在正试图合并到我们的构建系统中的视频。项目使用mingw和cmake。
我已经成功地编译了视频库 (https://github.com/scrawl/ogre-ffmpeg-videoplayer) 并且我成功地 link 它与我的项目相得益彰。
问题出现在主项目 linking 期间,它抱怨对我们之前工作正常的基本 ogre 函数的未定义引用。它指向新视频库中发生引用失败的代码行。
视频库依赖于 ogre 和 ffmpeg,最初我得到了对 ffmpeg 函数的未定义引用,但是在我的主项目管理 link ffmpeg 库之后,这些错误消失了,所以我不明白当前未定义的食人魔引用。
可能需要注意的一件事是,当视频库正在编译时,g++ 命令不会引用 ogre 或 ffmpeg,即使 cmake 文件正在对它们调用 target_link_libraries。这对我来说有点奇怪,但又可能只是我缺乏 linking 理解,因为它编译得很好。
这是包含主要 linking 错误的完整构建日志: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 在失败命令中被 link 编辑,该命令包含引用的 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
我的第一个想法可能是视频库编译问题不是 linking to ogre 因为 g++ 命令没有提到 ogre,但是 cmakelists.txt 似乎没问题(我确认它找到了 ogre 并且 ogre 包含在 target_link_libraries)
我的第二个想法是,也许他们 link 不同版本的 ogre,但这不可能,因为他们都找到相同的 ogre 安装和相同的 ogre 库。
是否有人能够发现我可能做错了什么以及我可以尝试如何解决这个问题?
谢谢!
我设法解决了。
在 target_link_libraries 命令中将库列表重新排序为 link,以便在 ogre 似乎解决了我的问题之前包含新的视频库。
我会在 6 小时内接受我自己的回答
似乎有一堆与此类似的问题,但他们似乎都回答了与我正在做的事情无关的问题。
一年多来我一直在使用 Ogre3D 开发 C++ 项目,目前我正在尝试添加对播放视频的支持。我找到了一个合适的库,它使用 ogre 和 ffmpeg 来播放我现在正试图合并到我们的构建系统中的视频。项目使用mingw和cmake。
我已经成功地编译了视频库 (https://github.com/scrawl/ogre-ffmpeg-videoplayer) 并且我成功地 link 它与我的项目相得益彰。
问题出现在主项目 linking 期间,它抱怨对我们之前工作正常的基本 ogre 函数的未定义引用。它指向新视频库中发生引用失败的代码行。
视频库依赖于 ogre 和 ffmpeg,最初我得到了对 ffmpeg 函数的未定义引用,但是在我的主项目管理 link ffmpeg 库之后,这些错误消失了,所以我不明白当前未定义的食人魔引用。
可能需要注意的一件事是,当视频库正在编译时,g++ 命令不会引用 ogre 或 ffmpeg,即使 cmake 文件正在对它们调用 target_link_libraries。这对我来说有点奇怪,但又可能只是我缺乏 linking 理解,因为它编译得很好。
这是包含主要 linking 错误的完整构建日志: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 在失败命令中被 link 编辑,该命令包含引用的 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
我的第一个想法可能是视频库编译问题不是 linking to ogre 因为 g++ 命令没有提到 ogre,但是 cmakelists.txt 似乎没问题(我确认它找到了 ogre 并且 ogre 包含在 target_link_libraries)
我的第二个想法是,也许他们 link 不同版本的 ogre,但这不可能,因为他们都找到相同的 ogre 安装和相同的 ogre 库。
是否有人能够发现我可能做错了什么以及我可以尝试如何解决这个问题?
谢谢!
我设法解决了。
在 target_link_libraries 命令中将库列表重新排序为 link,以便在 ogre 似乎解决了我的问题之前包含新的视频库。
我会在 6 小时内接受我自己的回答