8

我需要在 Fedora 24 机器上构建 Boost 1.62 和 1.63,但使用 GCC 4.9.3 或 GCC 5.4.0(取决于版本 CUDA,这就是我需要旧编译器的原因)。但是,如果我按照此答案中的描述设置自定义 GCC 版本并运行

/b2 --toolset=gcc-5.4.0 stage

令我懊恼的是,我现在看到:

    - 32-bit                   : no
    - 64-bit                   : yes
    - arm                      : no
    - mips1                    : no
    - power                    : no
    - sparc                    : no
    - x86                      : yes
    - symlinks supported       : yes
    - C++11 mutex              : no
    - lockfree boost::atomic_flag : yes
    - Boost.Config Feature Check: cxx11_auto_declarations : no
    - Boost.Config Feature Check: cxx11_constexpr : no
    - Boost.Config Feature Check: cxx11_defaulted_functions : no
    - Boost.Config Feature Check: cxx11_final : yes
    - Boost.Config Feature Check: cxx11_hdr_tuple : no
    - Boost.Config Feature Check: cxx11_lambdas : no
    - Boost.Config Feature Check: cxx11_noexcept : no
    - Boost.Config Feature Check: cxx11_nullptr : no
    - Boost.Config Feature Check: cxx11_rvalue_references : no
    - Boost.Config Feature Check: cxx11_template_aliases : no
    - Boost.Config Feature Check: cxx11_thread_local : no
    - Boost.Config Feature Check: cxx11_variadic_templates : yes

也就是说,很多 C++11 特性据说是缺失的,但它们不应该缺失。使用发行版的 GCC 版本 (6.2.1) 构建它时不会发生这种情况。

为什么会发生这种情况,我应该怎么做才能让 Boost 版本识别我的 GCC 5.4.0(或 4.9.3)的功能?

4

2 回答 2

9

以下解决方案已使用 Boost 1.62.0 + GCC 4.x、Boost 1.62.0 + GCC 5.x 和 Boost 1.65.1 + GCC 5.x 进行了测试。YMMV 与其他 Boost 版本,但我看不出它不应该工作的原因。

为了这个例子,我们假设:

  • 你想用 GCC 5.4 构建 Boost
  • g++ 5.4 二进制文件位于/some/where/g++-5.4
  • 您已经下载了 Boost 源并将它们解压缩到/path/to/sources/of/boost-1.62.0/
  • (也许)你想安装 Boost 到/dest/path
  • 你有 N 个核心(所以你想并行化构建 N 方式)

现在:

  1. (可选:确保你有 Boost 喜欢的库,例如:zlib, bzip2, lzma, zstd, iconv, icu
  2. cd /path/to/sources/of/boost-1.62.0/
  3. 通过运行 Booststrap 构建系统./bootstrap.sh
  4. echo "using gcc : 5.4 : /the/path/to/g++-5.4 : <cxxflags>-std=c++11 ;" > ./tools/build/src/user-config.jam
  5. ./b2 --toolset=gcc-5.4 -j N(N 是系统上的核心数)
  6. ./b2 install --prefix=/dest/path

笔记:

  • 动作 2 和 3 的顺序无关紧要。
  • 麾!GCC 6.x 或更高版本不会发生这种情况。
  • 如果您想要 GCC 5.4.0 的(未最终确定的)C++14 支持,您可以替换c++11为。c++1y如果您使用的是不同的 GCC 版本,请记住,在标准最终确定之前,您实际上并没有获得其可用的开关。因此,C++11 过去是指--std=c++1xC++17 是--std=c++1z,并且随着 GCC 版本在标准定稿后发布,开关会发生变化。
于 2017-05-01T08:37:25.520 回答
7

我有同样的问题。

看来,因为您正在交叉编译,所以 boost 构建系统正在尝试检查您的编译器是否支持所有这些 c++11 功能。问题是,为了做到这一点,构建系统编译了一张代码。其中一个文件是:boost_1_62_0/libs/rational/test/constexpr_test.cpp

然后,构建系统做了使用交叉编译器时没人会想到的事情......它试图在主机上执行生成的二进制文件......它显然失败了。所有这些 cxx11_ 测试都在发生这种情况。我也有这个问题,这是一个问题。因此,我无法使用 OpenWRT 为我的 Raspberries 构建 Boost.Fiber。

于 2016-10-10T11:35:51.250 回答