我构建了Gource项目。执行make时会出现编译错误。
g++ -std=gnu++0x -Wall -Wno-符号-比较-Wno-未使用-但-设置-变量-Wno-未使用-变量-g -O2 -pthread -pthread -o gource src/gource action.o src/gource bloom.o src/gource caption.o src/core/gource conffile.o src/gource display.o src/core/gource o src/core/gource/fxfont.o src/core/ologger.o src/core/gource。O src/core/src/core/gource resource.o.o src/core/sdlapp.o src/core/src/core/src/core/sdlapp.o src/core/gource Seklog.o src/core/gue-setings.o src/core/shader.o/co-shader.core/味精-shader_core/core/stringhash.o src/core/core texture.o src/core/png_gource_写成.o src/core/gource timezone.o src/core/gource vbo.o src/src/guec-vectors.o src/gource dinode.o src/gource file.o src/file.o/apache.o src/formats /gource bzr.o src/.o/gource提交.o src/格式/cvs cvs/formats/cvs cvs2cl.o src/co-cvs2cl.o src/gource/cvs git.osrc/格式-git.osrc/格式/gource hg.o src/formats/gource svn.o src/gource gucce.o src/gource gource_shell.o.o src/gource key.o src/gource logmill.o src/gource main.o src/gource pawn.o src/gource pline.o src/gml.osrc/user.o src/user.o src/gource zoomcamerera.o src/tinytinytinyxerxer.rc/gource/srcO src/tinyxml/gource tinyxml.o src/tinyxml/gource tinyxmlparser.o -lGL -lGLU -lfreetype -lpcre -lGLEW -lGLU -lGL -lSDL2_image -lSDL2 -lpng15 -lboost_system -lboost_filesystem src/gource_setings.o:函数
boost::filesystem::path::path<boost::filesystem::directory_entry>(boost::filesystem::directory_entry const&, boost::enable_if<boost::filesystem::path_traits::is_pathable<boost::decay<boost::filesystem::directory_entry>::type>, void>::type*)': /usr/include/boost/filesystem/path.hpp:139: undefined reference to-lSDL2 const&,std::__cxx11::basic_string&,std::codecvt const&)‘collect2: collect2: ld返回了1个退出状态
构建环境使用libboost_filesystem.so.1.53.0。
⋊> /h/m/Gource on master ◦ ll /usr/lib64/libboost_filesystem.so 18:26:31
lrwxrwxrwx. 1 root root 29 Sep 27 2020 /usr/lib64/libboost_filesystem.so -> libboost_filesystem.so.1.53.0*我使用strings挖掘libboost_filesystem.so.1.53.0并找到像boost::filesystem::path_traits::dispatch这样的符号。
⋊> /h/m/Gource on master ◦ strings /usr/lib64/libboost_filesystem-mt.so | grep path_traits 18:29:50
_ZN5boost10filesystem11path_traits8dispatchERKNS0_15directory_entryERSsRKSt7codecvtIwc11__mbstate_tE
_ZN5boost10filesystem11path_traits7convertEPKcS3_RSbIwSt11char_traitsIwESaIwEERKSt7codecvtIwc11__mbstate_tE
_ZN5boost10filesystem11path_traits7convertEPKwS3_RSsRKSt7codecvtIwc11__mbstate_tE查找符号:
> ⋊> /h/m/Gource on master ◦ nm -DC /usr/lib64/libboost_filesystem.so | grep dispatch
0000000000007800 T boost::filesystem::path_traits::dispatch(boost::filesystem::directory_entry const&, std::string&, std::codecvt<wchar_t, char, __mbstate_t> const&)图书馆的展览如下:
⋊> /h/m/Gource on master ◦ ls /usr/lib64/libboost_filesystem.so* -l 19:22:03
lrwxrwxrwx. 1 root root 29 Sep 27 2020 /usr/lib64/libboost_filesystem.so -> libboost_filesystem.so.1.53.0*
-rwxr-xr-x. 1 root root 94760 Apr 1 2020 /usr/lib64/libboost_filesystem.so.1.53.0*
-rwxr-xr-x. 1 root root 103592 Apr 24 2019 /usr/lib64/libboost_filesystem.so.1.69.0*这个编译错误意味着什么?提前谢谢。
发布于 2021-05-05 11:50:53
您的图书馆有一个符号:
boost::filesystem::path_traits::dispatch(boost::filesystem::directory_entry const&, std::string&, std::codecvt<wchar_t, char, __mbstate_t> const&)但是你的链接器正在寻找这个:
boost::filesystem::path_traits::dispatch(boost::filesystem::directory_entry const&, std::__cxx11::basic_string<char, std::char_traits, std::allocator >&, std::codecvt<wchar_t, char, __mbstate_t> const&)区别在于std::basic_string文件中的std::string,而在应用程序中则是std::__cxx11::basic_string。
当C++11标准化时,GCC必须更改它们的std::string实现。他们是在GCC 5里这样做的。我想你有GCC 5或更高的版本。您可以通过使用-D _GLIBCXX_USE_CXX11_ABI=0进行编译,告诉GCC使用旧的ABI,然后它将与您安装的库兼容。或者你可以安装用GCC 5或更高版本构建的新的Boost库。也许您安装的Boost 1.69.0库使用了新的ABI,您可以在它上尝试nm来找出答案。
请参阅:Understanding GCC 5's _GLIBCXX_USE_CXX11_ABI or the new ABI
https://stackoverflow.com/questions/67399782
复制相似问题