首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接库时对`boost::filesystem::path_traits::dispatch的未定义引用?

链接库时对`boost::filesystem::path_traits::dispatch的未定义引用?
EN

Stack Overflow用户
提问于 2021-05-05 10:45:04
回答 1查看 380关注 0票数 2

我构建了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。

代码语言:javascript
复制
⋊> /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这样的符号。

代码语言:javascript
复制
⋊> /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

查找符号:

代码语言:javascript
复制
> ⋊> /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&)

图书馆的展览如下:

代码语言:javascript
复制
⋊> /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*

这个编译错误意味着什么?提前谢谢。

EN

Stack Overflow用户

回答已采纳

发布于 2021-05-05 11:50:53

您的图书馆有一个符号:

代码语言:javascript
复制
boost::filesystem::path_traits::dispatch(boost::filesystem::directory_entry const&, std::string&, std::codecvt<wchar_t, char, __mbstate_t> const&)

但是你的链接器正在寻找这个:

代码语言:javascript
复制
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

票数 5
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67399782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档