2011-12-21 1 views
1

В настоящее время мой проект имеет следующее простое дерево:Как я могу указать, что я хочу C++ 0x в Makefile.am?

./Makefile.am 
./configure.ac 
./README 
./src/main.cpp 
./src/Makefile.am 
./bin 

Я пытаюсь следующий следующий урок:

http://www.gnu.org/software/automake/manual/automake.html#Hello-World

Как я могу поручить configure.ac использовать C++ 0x расширений? В частности, что, если привет-мировая линия в main.cpp файл выглядит следующим образом:

cout << ([]() {return "Hello, World!";})() << endl; 

эмитенты «делают» приводит к ошибке.

+0

Какой у вас компилятор? Если для GCC вам требуется 4.6 или более поздняя версия для lambdas, то это должен быть случай модификации make-файла, чтобы добавить флаг для размещения компилятора в режиме C++ 0X, либо --std = C++ 0x или -std = gnu ++ 0x в зависимости от того, нужен ли вам диалект GNU C++ 0x. – mark

+0

Возможный дубликат [Как использовать возможности C++ 11 с Autoconf?] (Http://stackoverflow.com/questions/7987952/how-to-use-c11-features-with-autoconf) – Flexo

+0

@awoodland, я попробовал ваше предложение из другой темы. Я получаю следующую ошибку: «./configure: строка 2962: синтаксическая ошибка рядом с неожиданным токеном' -std = C++ 0x, », после чего выделенная ошибочная строка выглядит следующим образом: AX_CHECK_COMPILE_FLAG (-std = C++ 0x, CXXFLAGS = "$ CXXFLAGS -std = C++ 0x"). В строке перед этим указывается «проверка стиля зависимостей g ++ ... gcc3». Я думаю, что это проблема. Но у меня установлен GCC 4.6.2, и это версия GCC по умолчанию. (Запуск gcc -v возвращает версию 4.6.2.) – Shredderroy

ответ

4

Если вы используете GCC (выглядит как вы), то из libstdc++ manual они есть примеры AUTOCONF для проверки C++ функций базового языка:

# AC_COMPILE_STDCXX_OX 
AC_DEFUN([AC_COMPILE_STDCXX_0X], [ 
    AC_CACHE_CHECK(if g++ supports C++0x features without additional flags, 
    ac_cv_cxx_compile_cxx0x_native, 
    [AC_LANG_SAVE 
    AC_LANG_CPLUSPLUS 
    AC_TRY_COMPILE([ 
    template <typename T> 
    struct check 
    { 
     static_assert(sizeof(int) <= sizeof(T), "not big enough"); 
    }; 

    typedef check<check<bool>> right_angle_brackets; 

    int a; 
    decltype(a) b; 

    typedef check<int> check_type; 
    check_type c; 
    check_type&& cr = c;],, 
    ac_cv_cxx_compile_cxx0x_native=yes, ac_cv_cxx_compile_cxx0x_native=no) 
    AC_LANG_RESTORE 
    ]) 

    AC_CACHE_CHECK(if g++ supports C++0x features with -std=c++0x, 
    ac_cv_cxx_compile_cxx0x_cxx, 
    [AC_LANG_SAVE 
    AC_LANG_CPLUSPLUS 
    ac_save_CXXFLAGS="$CXXFLAGS" 
    CXXFLAGS="$CXXFLAGS -std=c++0x" 
    AC_TRY_COMPILE([ 
    template <typename T> 
    struct check 
    { 
     static_assert(sizeof(int) <= sizeof(T), "not big enough"); 
    }; 

    typedef check<check<bool>> right_angle_brackets; 

    int a; 
    decltype(a) b; 

    typedef check<int> check_type; 
    check_type c; 
    check_type&& cr = c;],, 
    ac_cv_cxx_compile_cxx0x_cxx=yes, ac_cv_cxx_compile_cxx0x_cxx=no) 
    CXXFLAGS="$ac_save_CXXFLAGS" 
    AC_LANG_RESTORE 
    ]) 

    AC_CACHE_CHECK(if g++ supports C++0x features with -std=gnu++0x, 
    ac_cv_cxx_compile_cxx0x_gxx, 
    [AC_LANG_SAVE 
    AC_LANG_CPLUSPLUS 
    ac_save_CXXFLAGS="$CXXFLAGS" 
    CXXFLAGS="$CXXFLAGS -std=gnu++0x" 
    AC_TRY_COMPILE([ 
    template <typename T> 
    struct check 
    { 
     static_assert(sizeof(int) <= sizeof(T), "not big enough"); 
    }; 

    typedef check<check<bool>> right_angle_brackets; 

    int a; 
    decltype(a) b; 

    typedef check<int> check_type; 
    check_type c; 
    check_type&& cr = c;],, 
    ac_cv_cxx_compile_cxx0x_gxx=yes, ac_cv_cxx_compile_cxx0x_gxx=no) 
    CXXFLAGS="$ac_save_CXXFLAGS" 
    AC_LANG_RESTORE 
    ]) 

    if test "$ac_cv_cxx_compile_cxx0x_native" = yes || 
    test "$ac_cv_cxx_compile_cxx0x_cxx" = yes || 
    test "$ac_cv_cxx_compile_cxx0x_gxx" = yes; then 
    AC_DEFINE(HAVE_STDCXX_0X,,[Define if g++ supports C++0x features. ]) 
    fi 
]) 

Вы могли бы попытаться поставить лямбда там, если вам разыскивается. Затем с помощью HAVE_STDCXX_0X в руке вы можете установить --std = C++ 0x соответствующим образом.

+0

Вау! Большое спасибо за этот расширенный ответ. Теперь я попробую и отправлю обратно – Shredderroy

+0

Если вы не являетесь разработчиком autoconf, вам не следует определять макрос с именем, начинающимся с «AC_». Autoconf резервирует это пространство имен для себя. –