2016-10-03 6 views
7

Мне нужно построить Boost 1.62 и 1.63 на машине Fedora 24, но с использованием GCC 4.9.3 или GCC 5.4.0 (в зависимости от версии CUDA, из-за которой мне нужен старый компилятор). Но если установить версию пользовательских GCC, как описано в this answer и запуститьBoost build failed C++ 11 проверка функций при использовании (пользовательская) GCC 4.x или 5.x

/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)?

+0

@JanHudec: CUDA 7.5 поддерживает только версии GCC до 4.9.x – einpoklum

+2

Вам, вероятно, потребуется передать '--std = C++ 11' или' --std = C++ 0x'. Возможно, что-то вроде [этого ответа] (http://stackoverflow.com/a/18452918/2417774). gcc 6.2.1 по умолчанию использует '--std = C++ 14'. – llonesmiz

+1

@ jv_: Это, похоже, не работает, к сожалению. – einpoklum

ответ

2

Следующее решение было протестировано с 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
  • Г ++ 5.4 двоичных в /some/where/g++-5.4
  • Вы скачали и распаковали источники подталкивания в /path/to/boost-1.62.0/sources/
  • (возможно) вы хотите установить подталкивание к /dest/path
  • У вас есть N ядра (так что вы хотите, чтобы распараллелить сборки N- пути)

Сейчас:

  1. cd /path/to/boost-1.62.0/sources/
  2. подталкивания ремень системы сборки, запустив ./bootstrap.sh
  3. echo "using gcc : 5.4 : /some/where/g++-5.4 : <cxxflags>-std=c++11 ;" > ./tools/build/src/user-config.jam
  4. ./b2 --toolset=gcc-5.4 -j 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 после стандартной финализации.
5

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

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

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

+0

Хотя это объясняет неудачу и дает вам +1, это не помогает мне преодолеть эту проблему :-( – einpoklum

+0

Извините, я не заметил, что вы ответили. – Claymore

+2

Я тоже быстро вернулся! Если быть честным , Чтобы решить проблему с моей стороны, я закрепил файл Boam.Fiber build jamfile и удалил все требования. Настраиваемые разработчики никогда не отвечали мне, и это был единственный способ преодолеть эту проблему. Из-за этой проблемы , не смог построить Boost.Fiber, потому что строительная система просто отказалась это сделать. Вы можете увидеть здесь патч, который я отправил на OpenWRT https://github.com/openwrt/packages/pull/3510 – Claymore