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?
Odpowiedz
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).
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. –
+1, ponieważ łatwo jest dodać trzeci argument z AC_MSG_ERROR –
@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
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.
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. –
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.
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.
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
To jest lepsze rozwiązanie niż moje, które nie istniało, gdy pierwotnie odpowiadałem na to pytanie. – Flexo
@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
Jeśli nie chcesz korzystać z rozszerzeń GCC, przełącznik chcesz użyć jest „-std = C++ 0x”. –
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. –
W jaki sposób może to być duplikat, jeśli wcześniej został zadany? – lvella