Сборка Proxygen под Ubuntu 16.04

Я хотел бы создать http-библиотеки Facebook Proxygen C++ из github с Ubuntu 16.04. Вот среда, которую я настроил вместе с командой deps.sh для установки зависимостей:

gcc --version
  gcc (Ubuntu 5.4.0-6ubuntu1~16.04.1) 5.4.0 20160609
export CPPFLAGS="-std=c++14"
export CXXFLAGS="-std=c++14"
git clone [email protected]:facebook/proxygen.git
cd proxygen/proxygen && ./deps.sh

Это заставило меня большую часть пути построить свою глупую зависимость, но я получаю неполную ошибку типа:

libtool: compile:  g++ -DHAVE_CONFIG_H -I./.. -pthread -I/usr/include -std=c++14 -std=gnu++1y -std=c++14 -MT io/async/AsyncPipe.lo -MD -MP -MF io/async/.deps/AsyncPipe.Tpo -c io/async/AsyncPipe.cpp  -fPIC -DPIC -o io/async/.libs/AsyncPipe.o
In file included from /usr/include/c++/5/bits/move.h:57:0,
                 from /usr/include/c++/5/bits/stl_pair.h:59,
                 from /usr/include/c++/5/utility:70,
                 from /usr/include/c++/5/algorithm:60,
                 from ./../folly/Conv.h:26,
                 from Conv.cpp:16:
/usr/include/c++/5/type_traits: In instantiation of ‘struct std::make_unsigned<__int128>’:
Conv.cpp:528:52:   required from ‘folly::detail::ConversionResult<T> folly::detail::digits_to(const char*, const char*) [with Tgt = __int128]’
Conv.cpp:658:16:   required from here
/usr/include/c++/5/type_traits:1757:62: error: invalid use of incomplete type ‘class std::__make_unsigned_selector<__int128, false, false>’
     { typedef typename __make_unsigned_selector<_Tp>::__type type; };
                                                              ^
/usr/include/c++/5/type_traits:1721:11: note: declaration of ‘class std::__make_unsigned_selector<__int128, false, false>’
     class __make_unsigned_selector;
           ^
/usr/include/c++/5/type_traits: In instantiation of ‘struct std::make_unsigned<__int128 unsigned>’:
Conv.cpp:528:52:   required from ‘folly::detail::ConversionResult<T> folly::detail::digits_to(const char*, const char*) [with Tgt = __int128 unsigned]’
Conv.cpp:661:16:   required from here

Кто-нибудь пробовал или решил это? Я еще не знаком с кодовой базой. Тиа.


person moodboom    schedule 06.08.2016    source источник
comment
К вашему сведению, версия Boost, установленная Ubuntu 16.04, — 1.58.0.   -  person moodboom    schedule 06.08.2016
comment
Ваши параметры компилятора теперь выглядят так: -std=c++14 -std=gnu++1y -std=c++14. Если вы попытаетесь скомпилировать такой код: #include ‹algorithm› int main () { auto a = std::make_unsigned‹__int128› (); } вы потерпите неудачу из-за параметров компиляции. Просто удалите CPPFLAGS, CXXFLAGS.   -  person vadikrobot    schedule 12.08.2016
comment
Спасибо @vadikrobot. У меня не было набора [gnu++1y], поэтому я пробовал c++14.   -  person moodboom    schedule 12.08.2016


Ответы (1)


TL;DR Proxygen нужны расширения GNU; используйте -std=gnu++11 или -std=gnu++14


Почему вам нужно переопределить стандарт C++ при сборке proxygen и его зависимостей? Сама глупость указывает -std=gnu++1y. Если вы удалите

export CPPFLAGS="-std=c++14"
export CXXFLAGS="-std=c++14"

и попытаюсь построить его, он почти будет, единственное изменение, которое я должен был сделать по глупости, это исправить мембарьер .

Если вы настаиваете на использовании -std=c++14, то проблема на самом деле не в глупости, а в обработке libstdc++ расширений GNU, этой простой строки:

typedef std::make_unsigned<__int128>::type int128_type;

Легко скомпилируется с -std=gnu++11 или -std=gnu++1y, но не будет работать с любым из -std=c++11 или -std=c++14. И трудно сказать, является ли это ошибкой (поскольку компилятор предоставляет тип __int128 (и глупо обнаруживает это в своем скрипте configure, BTW), но у библиотеки C++ есть проблемы с этим) или особенностью (поскольку __int128 является расширением в первом место, и нужно использовать какой-то вариант стандарта GNU, чтобы правильно его получить).

person Roman Khimov    schedule 12.08.2016
comment
Это именно то, что я искал, вы сэкономили мне время на поиск этого расширения GNU. Также оцените патч за глупость. - person moodboom; 12.08.2016
comment
Теперь, чтобы на самом деле скомпилировать... без CPPFLAGS, используя gcc 5.4.0, я проверяю, поддерживает ли g++ функции C++1y с -std=gnu++1y... no - configure: ошибка: не удалось найти поддержку cxx1y в г++. Я добавил поддержку gnu++14 и понеслось. - person moodboom; 12.08.2016
comment
Конечный результат: собрано без ошибок, все тесты пройдены. Спасибо Роман. К вашему сведению, мне не нужен был патч глупости. - person moodboom; 12.08.2016
comment
Роман, как только я дошел до этапа установки, я обнаружил, что мне нужен твой патч membarrier. Спасибо. - person moodboom; 14.08.2016