2016-08-06 19 views
8

私はFacebookのProxygen C++ httpライブラリをgbubからUbuntu 16.04でビルドしたいと思っています。ここで私は依存関係をインストールするdeps.shコマンドと一緒に設定した環境です。Ubuntuの下でProxygenをビルドする16.04

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 

誰もがこれを試して解決しましたか?私はまだコードベースに精通していない。ティア。

+0

FYI Ubuntu 16.04が引き上げたバージョンは1.58.0です。 – moodboom

+1

コンパイラオプションは、 "-std = C++ 14 -std = gnu ++ 1y -std = C++ 14"のようになりました。あなたはこのようなコードをコンパイルしようとした場合: の#includeを int型のmain(){ \t自動A =のstd :: make_unsigned <__int128>(); } コンパイルオプションのために失敗します。 CPPFLAGS、CXXFLAGSを削除するだけです。 – vadikrobot

+0

ありがとう@vadikrobot。私は[gnu ++ 1y]を設定していなかったので、私はC++ 14を試していたのです。 – moodboom

答えて

8

TL; DR ProxygenにはGNU拡張が必要です。 -std=gnu++11または-std=gnu++14


を使用する理由proxygenとその依存関係を構築するときに、あなたがC++標準を上書きする必要がありますか?フォリー自体は-std=gnu++1yと指定しています。あなたは

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

を削除し、それを構築しようとすると、それはほとんど、私は愚かにしなければならなかった唯一の変化はfix membarrierにあるだろう。

あなたが-std=c++14を使う、という場合、問題は実際に愚かではないが、それはGNU拡張ののlibstdC++取り扱いにですが、このシンプルなライン:

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

は簡単-std=gnu++11または-std=gnu++1yでコンパイルしますが、失敗します。 -std=c++11または-std=c++14のいずれかを指定します。コンパイラが__int128タイプを提供しているので(それは構成スクリプトBTWで愚かなことを検出しますが、C++ライブラリには問題があります)、または機能(__int128が最初の拡張であるため適切に入手するには、標準のGNU変形を使用する必要があります)。

+0

これはまさに私が探していたものです。あなたはGNU拡張を発見するために後ろ向きに作業する時間を節約しました。愚かな人にもパッチを気に入ってください。 – moodboom

+1

実際にコンパイルするにはgpp 5.4.0を使用してCPPFLAGSを使わずに、g ++が-std = gnu ++ 1yでC++ 1yの機能をサポートしているかどうかを調べる。no - configure:error:cxx1yを見つけることができなかったg ++でのサポート " gnu ++ 14のサポートを追加しました。 – moodboom

+0

最終結果:エラーなしで構築され、すべてのテストが合格しました。ローマに感謝します。私は愚かなパッチは必要ありませんでした。 – moodboom

関連する問題