使用(自定义)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 种方式并行构建)
现在:
- (可选:确保您拥有 Boost 喜欢的库,例如:
zlib
、bzip2
、lzma
、zstd
、iconv
, icu
)
cd /path/to/sources/of/boost-1.62.0/
- 通过 运行
./bootstrap.sh
提升构建系统
echo "using gcc : 5.4 : /the/path/to/g++-5.4 : <cxxflags>-std=c++11 ;" > ./tools/build/src/user-config.jam
./b2 --toolset=gcc-5.4 -j N
(N 是您系统上的内核数)
./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 版本在标准定稿后发布,开关也会发生变化。
我需要在 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 种方式并行构建)
现在:
- (可选:确保您拥有 Boost 喜欢的库,例如:
zlib
、bzip2
、lzma
、zstd
、iconv
,icu
) cd /path/to/sources/of/boost-1.62.0/
- 通过 运行
./bootstrap.sh
提升构建系统
echo "using gcc : 5.4 : /the/path/to/g++-5.4 : <cxxflags>-std=c++11 ;" > ./tools/build/src/user-config.jam
./b2 --toolset=gcc-5.4 -j N
(N 是您系统上的内核数)./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 版本在标准定稿后发布,开关也会发生变化。