2016-06-05 8 views
4

Ich entwickle eine Software mit C- und C++ - Code. Ich habe vor kurzem etwas Code in C++ 11 Standard hinzugefügt. In configure.ac schrieb ich:Wie kompiliere ich ein Projekt mit clang und der Option -std = C++ 11, benutze autotools

for f in '-std=c++11' '-std=c++11 -stdlib=libc++' 
do 
    AX_CHECK_COMPILE_FLAG([$f], [CXXFLAGS="$CXXFLAGS $f" stdpass=true], [], [], []) 
${stdpass-false} && break 
done 
if ! "${stdpass-false}"; then 
    AC_MSG_ERROR([Unable to turn on C++11 mode with this compiler]) 
fi 

Mit gcc ich kein Problem habe, alles gut geht, die Option -std = C++ 11 nur auf g angewendet wird ++ und nicht auf gcc. Wenn ich versuche, mit zu konfigurieren:

CC=clang ./configure 

Ich habe folgende Fehlermeldung:

checking whether C compiler accepts -std=c++11... no 
checking whether C compiler accepts -std=c++11 -stdlib=libc++... no 
configure: error: Unable to turn on C++11 mode with this compiler 

Es ist wie, wenn die Option auf dem C-Compiler angewandt wurde und nicht nur auf Klirren ++ (wie es mit gcc getan).

Kann mir jemand helfen herauszufinden, was ich falsch mache.

+1

Überprüfen Sie 'config.log', um den eigentlichen Kompilierungsbefehl und den resultierenden Fehler zu sehen. –

+4

Diese "Überprüfung, ob ** C ** Compiler ..." - Nachricht lässt mich denken, dass Sie vergessen [die Sprache einzustellen] (https://www.gnu.org/software/autoconf/manual/autoconf-2.63/html_node /Language-Choice.html). –

+2

Außerdem sollten Sie 'CXX = clang ++./Configure' verwenden, um den C++ - Compiler zu setzen. –

Antwort

1

OK, nach einigen Untersuchungen habe ich die Antwort. Zuerst in configure.ac muss ich die Sprache eingestellt ich benutze:

AC_LANG([C]) 
AC_LANG([C++]) 

Dann gibt es bereits ein autoconf Makro, das für C++ 11-Unterstützung in der C++ Compiler überprüft: AX_CXX_COMPILE_STDCXX_11.

Also, folgen Sie diesem Link: https://www.gnu.org/software/automake/manual/html_node/Local-Macros.html, Ich muss einen M4-Ordner erstellen und die Makrodefinition einfügen. Der beste Weg, um fortzufahren ist, nur die allgemeinere ax_cxx_compile_stdcxx.m4 Datei herunterzuladen (und nicht ax_cxx_compile_stdcxx_11.m4). Also, immer in configure.ac ich schreibe:

AC_CONFIG_MACRO_DIR([m4]) 

und

m4_include([m4/ax_cxx_compile_stdcxx.m4]) 
AX_CXX_COMPILE_STDCXX(11, noext, mandatory) 

und Voilà. Alles ist in Ordnung, zumindest auf der Maschine, die ich getestet habe.