2016-08-06 25 views
8

Ich möchte Facebook Proxygen C++ http Bibliotheken aus Github mit Ubuntu 16.04 bauen. Hier ist die Umgebung, die ich zusammen mit dem deps.sh Befehl einrichten, um Abhängigkeiten zu installieren:Build Proxygen unter Ubuntu 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 

Das hat mir die meisten des Weges durch seine Torheit Abhängigkeit bauen, aber ich bin immer einen unvollständigen Typ Fehler:

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 

Hat jemand versucht oder gelöst? Ich kenne die Codebasis noch nicht. Tia.

+0

FYI die Boost-Version von Ubuntu 16.04 ist 1.58.0 gezogen. – moodboom

+1

Ihre Compileroptionen sehen jetzt wie "-std = C++ 14 -std = gnu ++ 1y -std = C++ 14" aus. Wenn Sie versuchen, Code wie folgt zu kompilieren: # include int main() { \t auto a = std :: make_unsigned <__int128>(); } Sie werden aufgrund von Kompilierungsmöglichkeiten fehlschlagen. Löschen Sie einfach CPPFLAGS, CXXFLAGS. – vadikrobot

+0

Danke @vadikrobot. Ich hatte [gnu ++ 1y] nicht eingestellt, deshalb habe ich C++ 14 probiert. – moodboom

Antwort

8

TL; DR Proxygen benötigt GNU-Erweiterungen; verwenden -std=gnu++11 oder -std=gnu++14


Warum müssen Sie C++ Standard außer Kraft setzen, wenn proxygen und seine Abhängigkeiten bauen? Torheit selbst spezifiziert -std=gnu++1y. Wenn Sie

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

entfernen und versuchen, es zu bauen, wird es fast, die einzige Änderung, die ich hatte, um zu Torheit fix membarrier ist.

Wenn Sie darauf bestehen, -std=c++14 verwenden, dann ist das Problem eigentlich nicht in Torheit, es ist in libstdC++ Umgang mit GNU-Erweiterungen, diese einfache Linie:

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

leicht mit -std=gnu++11 oder -std=gnu++1y, kompilieren aber fehl mit irgendeinem von -std=c++11 oder -std=c++14. Und es ist schwer zu sagen, ob es ein Fehler ist (weil der Compiler __int128 Typ bereitstellt (und Folly erkennt, dass in seinem Configure-Skript BTW) aber C++ - Bibliothek Probleme hat) oder ein Feature (__int128 ist eine Erweiterung in der ersten Ort und man sollte eine GNU-Variante des Standards verwenden, um es richtig zu bekommen).

+0

Dies ist genau das, wonach ich gesucht habe. Sie haben mir die Zeit gespart, rückwärts zu arbeiten, um diese GNU-Erweiterung zu entdecken. Schätze den Patch auch für Torheit. – moodboom

+1

Nun zum eigentlichen kompilieren ... ohne CPPFLAGS, mit gcc 5.4.0, bekomme ich "prüfen, ob g ++ unterstützt C++ 1y Funktionen mit -std = gnu ++ 1y ... nein - configure: error: Konnte cxx1y nicht finden Unterstützung in g ++ ". Ich habe Unterstützung für gnu ++ 14 hinzugefügt und wir gehen weiter. – moodboom

+0

Endergebnis: ohne Fehler gebaut, alle Tests bestanden. Danke Roman. FYI Ich brauchte den Torheitspatch nicht. – moodboom