Boost build не проходит проверку функций C ++ 11 при использовании (настраиваемого) GCC 4.x или 5.x

Мне нужно собрать 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)?

8

Решение

Следующее решение было протестировано с Boost 1.62.0 + GCC 4.x, Boost 1.62.0 + GCC 5.x и Boost 1.65.1 + GCC 5.x. YMMV с другими версиями Boost, но я не вижу причин, почему он не должен работать.

Для этого примера предположим, что:

  • Вы хотите собрать Boost с GCC 5.4
  • Двоичный файл g ++ 5.4 находится в /some/where/g++-5.4
  • Вы скачали источники Boost и распаковали их в /path/to/sources/of/boost-1.62.0/
  • (Возможно) вы хотите установить Boost для /dest/path
  • У вас есть N ядер (поэтому вы хотите распараллелить N-образные сборки)

Сейчас:

  1. cd /path/to/sources/of/boost-1.62.0/
  2. Усилить систему сборки, запустив ./bootstrap.sh
  3. echo "using gcc : 5.4 : /the/path/to/g++-5.4 : <cxxflags>-std=c++11 ;" > ./tools/build/src/user-config.jam
  4. ./b2 --toolset=gcc-5.4 -j N (N — количество ядер в вашей системе)
  5. ./b2 install --prefix=/dest/path

Заметки:

  • Порядок действий 2 и 3 не имеет значения.
  • Вы можете заменить c++11 с c++1y если вы хотите GCC 5.4.0 (не финализированную) поддержку C ++ 14. Если вы используете другую версию GCC, помните, что до того, как стандарт будет завершен, вы фактически не получите его переключатель. Таким образом, C ++ 11 имел обыкновение означать --std=c++1x и C ++ 17 был --std=c++1z и переключатели меняются по мере выпуска версий GCC после стандартной доработки.
8

Другие решения

У меня та же проблема.

Похоже, что поскольку вы выполняете кросс-компиляцию, система Boost-Building пытается проверить, поддерживает ли ваш компилятор все эти функции c ++ 11.
Дело в том, что для этого система сборки компилирует лист кода.
Один из этих файлов: boost_1_62_0/libs/rational/test/constexpr_test.cpp

Затем система сборки делает то, о чем никто не подумает, когда использует кросс-компилятор … она пытается выполнить результирующий двоичный файл на главном компьютере … Это, очевидно, дает сбой.
Это происходит для всех этих тестов cxx11_. У меня также есть эта проблема, и это проблема. Из-за этого я не могу собрать Boost.Fiber для моей Raspberries с OpenWRT.

7