问题
I need to build Boost 1.62 and 1.63 on a Fedora 24 machine, but using GCC 4.9.3 or GCC 5.4.0 (depending on the version CUDA, which is the reason why I need an older compiler). But if I set the custom GCC version as described in this answer and run
/b2 --toolset=gcc-5.4.0 stage
To my chagrin, I now see:
- 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
i.e. a lot of C++11 features are supposedly missing, while they should not be. This does not occur when building it with the distribution's GCC version (6.2.1).
Why is this happening and what should I do to make the Boost build recognize my GCC 5.4.0 (or 4.9.3)'s capabilities?
回答1:
The following solution was tested with Boost 1.62.0 + GCC 4.x, Boost 1.62.0 + GCC 5.x and Boost 1.65.1 + GCC 5.x. YMMV with other Boost versions but I see no reason why it shouldn't work.
Let's assume for the sake of this example that:
- You want to build Boost with GCC 5.4
- The g++ 5.4 binary is at
/some/where/g++-5.4
- You've downloaded the Boost sources and unpacked them into
/path/to/sources/of/boost-1.62.0/
- (Perhaps) you want to install Boost to
/dest/path
- You have N cores (so you want to parallelize the build N-ways)
Now:
- (Optional: Make sure you have the libraries Boost likes to have, e.g.:
zlib
,bzip2
,lzma
,zstd
,iconv
,icu
) cd /path/to/sources/of/boost-1.62.0/
- Booststrap the build system by running
./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 being the number of cores on your system)./b2 install --prefix=/dest/path
Notes:
- The order of actions 2 and 3 doesn't matter.
- Rejoice! This doesn't happen with GCC 6.x or later versions.
- You can replace
c++11
withc++1y
if you want GCC 5.4.0's (non-finalized) C++14 support. If you're using a different GCC version, remember that before a standard is finalized you don't actually get its switch available. Thus C++11 used to mean--std=c++1x
and C++17 was--std=c++1z
and the switches change as GCC versions get released after standard finalization.
回答2:
I'm having the same issue.
It seems that, because you are cross-compiling, the boost building system is trying to check if your compiler supports all of those c++11 features.
The thing is, in order to do that, the build system compiles a sheet of code.
One of those files is this: boost_1_62_0/libs/rational/test/constexpr_test.cpp
Then, the build system does what no one would think when using a cross-compiler... it tries to execute the resultant binary on the host computer... It obviously fails. That is happening for all of those cxx11_ tests. I'm also having that issue and it is a problem. Because of this, I'm unable to build Boost.Fiber for my Raspberries with OpenWRT.
来源:https://stackoverflow.com/questions/39826917/boost-build-fails-c11-feature-checks-when-using-custom-gcc-4-x-or-5-x