Travis CI 上的 Boost 中对 `std::__cxx11::basic_string 的未定义引用
Posted
技术标签:
【中文标题】Travis CI 上的 Boost 中对 `std::__cxx11::basic_string 的未定义引用【英文标题】:undefined reference to `std::__cxx11::basic_string in Boost on Travis CI 【发布时间】:2016-11-20 15:33:03 【问题描述】:我正在尝试获取一个 C++ 项目,该项目使用 GitHub 上的 Boost 在 Travis CI 上正确编译。
首先我在 ubuntu 上尝试了软件包和 PPA,但它们太旧了(我至少需要 Boost 1.61)。
只有在 Travis CI 上编译 Boost(下载、编译)时,它才能工作,但不幸的是,编译时间很长(11-18 分钟)而且日志文件也很大。
考虑如何解决这个问题,我想到了在我的机器上编译 boost,压缩,上传到一些网络服务器,然后下载和复制 /usr/local/[include/lib] 上的相应文件。
Here 是我在我的机器上使用的编译器。我使用
编译了 boost./bootstrap.sh --prefix=/home/andrei/boostabc
/usr/bin/time ./b2 install link=static
Here 是 travis 文件(和存储库)。在 cmets 中是我编译 boost 的方式。
问题是我得到了很多错误:
/usr/local/lib/libboost_filesystem.a(operations.o): In function `(anonymous namespace)::dir_itr_first(void*&, void*&, char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, boost::filesystem::file_status&, boost::filesystem::file_status&) [clone .isra.46] [clone .constprop.56]':
operations.cpp:(.text+0xa8): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_assign(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
我用谷歌搜索了这个errors,发现可能有关于某些 C++11 ABI 和宏的错误配置。我不太理解这个解释,也不知道如何让它发挥作用。
如果您能指出解决此问题的正确方向,我将不胜感激。
【问题讨论】:
也使用 Travis CI 进行 boost,但将其设为一个单独的项目,它将获取源代码、构建 boost、打包它并上传到存储库(例如“一些网络服务器”)。我在我的 CI 系统中使用了类似的过程,除了我使用工件存储库和依赖管理将事物联系在一起。如果每次提交都会触发所有使用的依赖项的构建,那会发疯。 【参考方案1】:您应该尝试将 -D_GLIBCXX_USE_CXX11_ABI=0 添加到用于编译它的命令行中,看看是否可以解决问题。
我认为您调用的一个或另一个 g++/gcc 很可能不是版本 6 ...否则默认情况下 iirc 将设置为 1。
This is documented here
【讨论】:
我确信我使用 gcc 6.2 在我的机器上构建了 boost(我有 bin.v2/libs/atomic/gcc-6.2.0 之类的文件夹。Travis 的 Cmake 确认我使用的是 6.2。 0(CXX 编译器标识是 GNU 6.2.0)。我不知道还有什么地方会使用另一个版本的 gcc。我会尝试使用该标志进行编译(比如 b2 install -D_GLIBCXX_USE_CXX11_ABI=0 ?)。跨度> 【参考方案2】:可能ISO C++不支持,根据linker的结果,可以尝试用g++ yourfiles.cc -std=c++11
编译
【讨论】:
以上是关于Travis CI 上的 Boost 中对 `std::__cxx11::basic_string 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章