2016-07-12 9 views
1

TL; DR:Wie Boost verwenden Asio mit Klirren/c2

  • Hat Boost Asio (Boost-Version 1.61) mit Klirren/c2 (das Klirren ++ Frontend, das in verwenden, jemand in der Lage integriert ist VS2015 Update 3)?
  • Wenn ja, welche Optionen haben Sie benutzt?

Ich habe ein Programm, das Auftrieb der Asio-Bibliothek verwendet. Es funktioniert fehlerfrei, wenn es mit MSVC++ (VS2015 Update 3) unter Win10 und g ++ 4.8 unter Ubuntu 14.04 kompiliert wird, aber ich würde auch gerne das clang-Frontend verwenden, das mit neueren Versionen von Visual Studio geliefert wird (ich glaube seit Update 1) .

Meine erste Kommandozeilen-Optionen (von der Projekteigenschaften Seite kopiert) sah wie folgt aus:

-fpic "stdafx.h" -std=c++1y -fstack-protector "Clang\" -fno-strict-aliasing -ffunction-sections -g2 -gdwarf-2 -O0 -x c++-header -D "_WINSOCK_DEPRECATED_NO_WARNINGS" -D "NOMINMAX" -frtti -fomit-frame-pointer -fdata-sections -fno-ms-compatibility -std=c11 -fexceptions -o "Clang\%(filename).obj" -fms-extensions -fno-short-enums

die mir die folgenden Fehler gab:

void __cdecl boost::detail::atomic_increment(struct __clang::_Atomic<int> *)': Unexpected atomic instruction -- use Windows interlock intrinsics 

So offenbar müde steigern Klirren zu verwenden/gcc intrinsics, die nicht von der clang/c2-Version unterstützt werden, anstatt die Windows-spezifischen intrinsics zu verwenden, die sie verwenden würden, wenn sie mit VC++ kompiliert werden. Ich spielte mit den verschiedenen Compiler-Optionen um und das einzige, was eine Wirkung zu haben schien, war un-definieren den __clang__ Präprozessorsymbol (durch die folgende Option in der Befehlszeile):

-U "__clang__" 

die des losgeworden atomarer Fehler, aber jetzt bekomme ich mehrere Seiten mit Fehlermeldungen, die mit einigen Boost-MPL-Makros zu tun haben. Hier sind die ersten Zeilen:

1> In file included from main.cpp:1: 
1> In file included from D:\mylibs\boost\include\boost/program_options.hpp:15: 
1> In file included from D:\mylibs\boost\include\boost/program_options/options_description.hpp:13: 
1> In file included from D:\mylibs\boost\include\boost/program_options/value_semantic.hpp:12: 
1> In file included from D:\mylibs\boost\include\boost/any.hpp:20: 
1> In file included from D:\mylibs\boost\include\boost/type_index.hpp:29: 
1> In file included from D:\mylibs\boost\include\boost/type_index/stl_type_index.hpp:40: 
1>D:\mylibs\boost\include\boost/mpl/if.hpp(131,23): error : too many arguments provided to function-like macro invocation 
1> BOOST_MPL_AUX_NA_SPEC(3, if_) 
1>      ^
1> D:\mylibs\boost\include\boost/preprocessor/facilities/expand.hpp(26,10) : note: macro 'BOOST_PP_EXPAND_I' defined here 
1> # define BOOST_PP_EXPAND_I(x) x 
1>   ^

Hat jemand eine Lösung dafür?

Beachten Sie, dass meine Frage nicht zum Erstellen der Boost-Bibliotheken selbst wie in diesem Post lautet: Command parameters for b2 in order to build Boost libraries with Microsoft's Clang/C2. Und ja, ich bin mir bewusst, dass es keine offizielle Unterstützung für clang/c2 von Boost gibt, aber ich frage mich, ob jemand einen Hack kennt, der den richtigen Satz von Boost-Konfigurationsmakros erzeugen würde.

Antwort

5

Erste Boost- Header sauber mit Clang/C2 zu kompilieren ist entscheidend für die Herstellung Clang/C2 nützlich, so arbeiten wir an Unterstützung für die Clang-style Atom intrinsics. Sie werden in einem zukünftigen Update von Clang/C2 verfügbar sein.

ich nicht bewusst, so bin davon zu überzeugen, Boost- die MSVC Version der Spezifika zu verwenden, während immer noch mit Clang kompiliert, es sei denn, Sie bereit sind, die Boost-Header zu hacken.

+0

Vielen Dank für den Kopf. Zu Testzwecken wäre ich eigentlich bereit, die Header zu hacken, wenn mir jemand genau sagen könnte, wo ich was ändern muss.Gerade jetzt ist es einfach nicht wichtig genug für mich, die Boost-Konfigurations-Header selbst zu durchsuchen, um nach den richtigen Definitionen zu suchen, wenn ich nicht weiß, ob es überhaupt überhaupt möglich ist. – MikeMB

1

Versuchen Sie, das Makro BOOST_SP_USE_STD_ATOMIC in Ihren Compiler-Optionen oder direkt vor Ihnen #include Boost-Header zu definieren.