2011-11-02 3 views
11

Mam projekt skonfigurowany przez Autoconf i chcę rozpocząć korzystanie z funkcji C++ 11 w tym projekcie. Jak zawsze włączyć przełącznik "-std = gnu ++ 0x" i czy obsługa funkcji została sprawdzona podczas konfigurowania?Jak korzystać z funkcji C++ 11 w Autoconf?

+2

Jeśli nie chcesz korzystać z rozszerzeń GCC, przełącznik chcesz użyć jest „-std = C++ 0x”. –

+0

Zostało to rozwiązane za pomocą makra Autoconf tutaj http://stackoverflow.com/questions/8585110/how-can-i-specify-that-i-want-c0x-in-makefile-am. Zaletą jest to, że nie zakończy się niepowodzeniem, jeśli nie masz obsługi kompilatora C++ 11, podczas gdy AC_CHECK_COMPILE_FLAG zatrzyma kompilację, gdy zawiedzie. –

+0

W jaki sposób może to być duplikat, jeśli wcześniej został zadany? – lvella

Odpowiedz

13

Można to zrobić z czymś AX_CHECK_COMPILE_FLAG, np:

AX_CHECK_COMPILE_FLAG([-std=c++0x], [ 
         CXXFLAGS="$CXXFLAGS -std=c++0x"]) 

(Trzeba być ostrożnym tutaj AC_LANG jest C++, a nie C w punkcie nazywa się to dlatego, że jest możliwe, aby korzystać z gcc dla C i coś jeszcze dla C++ lub odwrotnie).

+1

To prawdopodobnie nie wystarcza: jeśli kompilator nie obsługuje -std == C++ 0x, to konfiguracja zakończy się pomyślnie, ale kompilacja się nie powiedzie. –

+0

+1, ponieważ łatwo jest dodać trzeci argument z AC_MSG_ERROR –

+0

@WilliamPursell - bardziej użyteczną rzeczą może być użycie AC_DEFINE w połączeniu z tym, aby kompilacja mogła nadal działać, tylko z różnymi implementacjami niektórych części w Dokładnie w ten sam sposób radzę sobie z brakującym 'snprintf' w C dzisiaj. Może to być mniej funkcji wyeksponowanych lub odsłoniętych za pośrednictwem alternatywnego interfejsu, ale prawdopodobnie nie jest to obecnie korekcja show. – Flexo

1

Aby włączyć przełącznik kompilatora (o ile, oczywiście, użytkownik zastępuje go), umieścić to w swojej Makefile.am:

AM_CXXFLAGS=-std=c++0x 

Nie sądzę, istnieje kontrola dostępny na obecność C++ 11 funkcji, ale powinieneś być w stanie napisać program testowy dość łatwo z funkcjami, których chcesz użyć, które nie będą działać, jeśli te funkcje nie są obsługiwane. Następnie można napisać test, jak opisano w this section of the Autoconf manual.

+1

Jeśli test zakończy się niepowodzeniem bez funkcji C++ 11, flaga będzie musiała być w CXXFLAGS lub konfiguracja zawsze zakończy się niepowodzeniem. –

4

Myślę, że najprostszym sposobem, aby to zrobić, to dodać:

 
CXXFLAGS="$CXXFLAGS -std=c++0x" 

w configure.ac przed AC_PROG_CXX. Jeśli kompilator nie zaakceptuje opcji -std = C++ 0x, wówczas konfiguracja zakończy się niepowodzeniem, ponieważ "kompilator C++ nie może tworzyć plików wykonywalnych". Nie jest to najlepszy komunikat o błędzie, ale gwarantuje, że kompilacje się powiodą, jeśli konfiguracja się powiedzie. Aby uzyskać lepszy komunikat o błędzie, możesz sprawdzić, czy kompilator akceptuje flagę po AC_PROG_CXX. W obu przypadkach chcesz, aby konfiguracja zakończyła się niepowodzeniem, jeśli kompilator nie zapewni wymaganych funkcji, ale wymaga tego twoje oprogramowanie.

Należy zauważyć, że ustawienie CXXFLAGS przed AC_PROG_CXX ma niepożądany skutek uboczny, uniemożliwiając ustawienie domyślne dla CXXFLAGS w przypadku, gdy użytkownik nie ustawił tej zmiennej podczas uruchamiania configure. Z tego powodu zwykle nie zaleca się ustawiania CXXFLAGS w konfiguracji, więc prawdopodobnie lepiej jest sprawdzić flagę po AC_PROG_CXX (np. Używając rozwiązania awoodlanda) - wystarczy, że dodasz AC_MSG_ERROR do trzeciego argumentu AX_CHECK_COMPILE_FLAG, aby konfiguracja kończy się niepowodzeniem, jeśli funkcje nie są dostępne.

17

Czy sprawdziłeś numer ax_cxx_compile_stdcxx_11?

Myślę, że to dokładnie to, czego chcesz.

Istnieje duża biblioteka makro na gnu website.

+4

Jest to najprawdopodobniej właściwe rozwiązanie. Ludzie muszą po prostu pamiętać, aby zainstalować pakiet archiwalny 'autoconf-archive' w Debianie i uruchomić' aclocal' przed uruchomieniem 'autoconf' (aby pobrać wymagane makra do' aclocal.m4'). – carandraug

+0

To jest lepsze rozwiązanie niż moje, które nie istniało, gdy pierwotnie odpowiadałem na to pytanie. – Flexo

+0

@carandraug Doceniam to, jeśli Ty lub OP będziecie mogli podać więcej szczegółów. Jaka jest prawidłowa instalacja i składnia do użycia? Przed instalacją autoconf-archive zawsze otrzymuję błąd składniowy (nie "nie znaleziono") podczas wywołania w configure.ac. Po zainstalowaniu autoconf-archive dostaję "błąd składni: w pobliżu nieoczekiwanego tokena ac_config_headers =" $ ac_config_headers config.h "' – garyp