Мне нужно собрать Boost 1.62 и 1.63 на машине с Fedora 24, но с использованием 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)?
Следующее решение было протестировано с Boost 1.62.0 + GCC 4.x, Boost 1.62.0 + GCC 5.x и Boost 1.65.1 + GCC 5.x. YMMV с другими версиями Boost, но я не вижу причин, почему он не должен работать.
Для этого примера предположим, что:
/some/where/g++-5.4
/path/to/sources/of/boost-1.62.0/
/dest/path
Сейчас:
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
Заметки:
c++11
с c++1y
если вы хотите GCC 5.4.0 (не финализированную) поддержку C ++ 14. Если вы используете другую версию GCC, помните, что до того, как стандарт будет завершен, вы фактически не получите его переключатель. Таким образом, C ++ 11 имел обыкновение означать --std=c++1x
и C ++ 17 был --std=c++1z
и переключатели меняются по мере выпуска версий GCC после стандартной доработки.У меня та же проблема.
Похоже, что поскольку вы выполняете кросс-компиляцию, система Boost-Building пытается проверить, поддерживает ли ваш компилятор все эти функции c ++ 11.
Дело в том, что для этого система сборки компилирует лист кода.
Один из этих файлов: boost_1_62_0/libs/rational/test/constexpr_test.cpp
Затем система сборки делает то, о чем никто не подумает, когда использует кросс-компилятор … она пытается выполнить результирующий двоичный файл на главном компьютере … Это, очевидно, дает сбой.
Это происходит для всех этих тестов cxx11_. У меня также есть эта проблема, и это проблема. Из-за этого я не могу собрать Boost.Fiber для моей Raspberries с OpenWRT.