【问题标题】:Boost build fails C++11 feature checks when using (custom) GCC 4.x or 5.x使用(自定义)GCC 4.x 或 5.x 时,Boost 构建未能通过 C++11 功能检查
【发布时间】:2017-02-11 02:54:45
【问题描述】:

我需要在 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)的功能?

【问题讨论】:

  • @JanHudec:CUDA 7.5 仅支持 GCC 版本高达 4.9.x
  • 您可能需要传递--std=c++11--std=c++0x。也许像this answer 这样的东西。 gcc 6.2.1 可能默认使用--std=c++14
  • @jv_:不幸的是,这似乎不起作用。
  • 这里有同样的症状。在 Windows 上使用与 Qt 5.6.1 捆绑的 MinGW (GCC 4.9.2)。
  • @rettichschnidi 和 einpoklum。我知道情况不同,但比较 g++ 6.2(默认为 std=c++14)和 clang++ 3.8(默认为 std=c++98/03)。 b2 toolset=gcc stage -> 一切yesb2 toolset=clang stage -> 主要是no 几个yes。删除目录bin.v2(避免缓存结果)后,b2 toolset=clang cxxflags="--std=c++11" stage -> 所有yes(thread_local 除外)。

标签: c++ c++11 gcc boost b2


【解决方案1】:

以下解决方案已使用 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 喜欢的库,例如:zlibbzip2lzmazstdiconvicu
  2. cd /path/to/sources/of/boost-1.62.0/
  3. 通过运行./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++1x,而 C++17 的意思是 --std=c++1z,并且随着 GCC 版本在标准定稿后发布,这些开关也会发生变化。

【讨论】:

    【解决方案2】:

    我也有同样的问题。

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

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

    【讨论】:

    • 虽然这解释了失败并让您获得 +1,但它并不能帮助我克服问题:-(
    • 对不起。我没注意到你已经回答了。
    • 我返回的太早了...老实说,为了从我这边解决问题,我修补了 Boost.Fiber 构建 jamfile 并删除了所有要求。提升开发人员从未回答我,这是我克服这个问题的唯一方法。由于这个问题,无法构建 Boost.Fiber,因为构建系统根本拒绝这样做。你可以在这里看到,我提交给OpenWRT的补丁github.com/openwrt/packages/pull/3510
    • @Claymore 你在这里找到解决方案了吗?我在github上看到你的cmets关于这个问题,但我不确定v1.63的boost是否有解决方案。我正在使用 Clang + libc++ 为 ARM 使用 NDK r14b 进行交叉编译。所有 c++11 测试都显示“否”支持。我能得到什么帮助吗?
    • @Claymore:我已经发布了答案,仅供参考。
    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2018-06-04
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多