使用(自定义)GCC 4.x 或 5.x 时,Boost 构建无法通过 C++11 功能检查

Boost build fails C++11 feature checks when using (custom) GCC 4.x or 5.x

我需要在 Fedora 24 机器上构建 Boost 1.62 和 1.63,但使用 GCC 4.9.3 或 GCC 5.4.0(取决于 CUDA 版本,这就是我需要旧编译器的原因)。但是,如果我按照 this answer 和 运行

中的描述设置自定义 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)的功能?

我遇到了同样的问题。

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

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

使用 Boost 1.62.0 + GCC 4.x、Boost 1.62.0 + GCC 5.x 和 Boost 1.65.1 + 测试了以下解决方案海湾合作委员会 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 喜欢的库,例如:zlibbzip2lzmazstdiconv , icu)
  2. cd /path/to/sources/of/boost-1.62.0/
  3. 通过 运行 ./bootstrap.sh
  4. 提升构建系统
  5. echo "using gcc : 5.4 : /the/path/to/g++-5.4 : <cxxflags>-std=c++11 ;" > ./tools/build/src/user-config.jam
  6. ./b2 --toolset=gcc-5.4 -j N(N 是您系统上的内核数)
  7. ./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++1x,而 C++17 表示 --std=c++1z,随着 GCC 版本在标准定稿后发布,开关也会发生变化。