2011-11-02 50 views
11

我有一個通過Autoconf配置的項目,我想在這個項目中開始使用C++ 11的功能。如何使「-std = gnu ++ 0x」開關始終處於啓用狀態並支持配置時檢查的功能?如何在Autoconf中使用C++ 11功能?

+2

除非你想使用GCC擴展大的宏庫,你要使用的開關是「-std =的C++ 0x」。 –

+0

這已經用Autoconf宏在這裏解決了http://stackoverflow.com/questions/8585110/how-can-i-specify-that-i-want-c0x-in-makefile-am。它的優點是,如果你沒有C++ 11編譯器支持,它不會失敗,而AC_CHECK_COMPILE_FLAG會在失敗時停止構建。 – 2013-01-03 09:00:49

+0

如果之前已經詢問過,這怎麼可能是重複的? – lvella

回答

13

你可以像AX_CHECK_COMPILE_FLAG做到這一點,如:

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

(你必須要小心這裏AC_LANG是C++,在點不是C這就是所謂的,因爲它是可以使用GCC對C和其他的C++或反之亦然)。

+1

這可能是不夠的:如果編譯器不支持-std == C++ 0x,那麼配置會成功,但構建將失敗。 –

+0

+1,因爲很容易添加AC_MSG_ERROR的第三個參數 –

+0

@WilliamPursell - 更有用的事情可能是使用AC_DEFINE與此結合使用,以便構建仍然可以繼續進行,只需使用不同的部分實現與我今天在C中處理'snprintf'丟失的方式完全一樣。這可能不是通過替代界面暴露或暴露的功能,但它可能不是現在的顯示屏。 – Flexo

1

爲了讓編譯器開關(除非,當然,用戶覆蓋它),把這個在您的Makefile.am

AM_CXXFLAGS=-std=c++0x 

我不認爲有一個爲C的存在可用支票++ 11功能,但您應該能夠使用要使用的功能輕鬆編寫測試程序,如果這些功能不受支持,則該功能將失敗。然後在this section of the Autoconf manual.

+1

如果在沒有C++ 11功能的情況下測試失敗,則標誌將需要位於CXXFLAGS中,否則配置將始終失敗。 –

4

描述,你可以寫一個測試,我認爲這樣做最簡單的方法是添加:

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

在AC_PROG_CXX前configure.ac。如果編譯器不接受-std = C++ 0x,則配置將失敗,並且「C++編譯器無法創建可執行文件」。它不是最好的錯誤消息,但它確保如果配置成功,構建將成功。要獲得更好的錯誤消息,可以檢查編譯器是否接受AC_PROG_CXX之後的標誌。無論哪種情況,如果編譯器不提供必要的功能,但軟件需要它,則希望配置失敗。

請注意,在用戶在運行configure時未設置該變量的情況下,在AC_PROG_CXX之前設置CXXFLAGS會產生妨礙CXXFLAGS默認設置的不良副作用。出於這個原因,通常不建議在configury中設置CXXFLAGS,所以最好在AC_PROG_CXX之後檢查標誌(例如使用awoodland的解決方案) - 只要確保在AX_CHECK_COMPILE_FLAG的第三個參數中添加了AC_MSG_ERROR,以便如果功能不可用,配置將失敗。

17

你查過ax_cxx_compile_stdcxx_11

我認爲這正是你想要的。

上有gnu website.

+4

這很可能是正確的解決方案。人們只需記住在Debian中安裝壓縮包'autoconf-archive',然後在運行'autoconf'(將所需的宏拉入'aclocal.m4')之前運行'aclocal'。 – carandraug

+0

這是比我的更好的解決方案,當我最初回答這個問題時並不存在。 – Flexo

+0

@carandraug如果您或OP能夠闡明更多細節,我將不勝感激。什麼是正確的安裝和使用語法?在安裝autoconf-archive之前,我總是會在configure.ac中調用一個語法錯誤(不是「找不到」)錯誤。安裝autoconf-archive後,我得到「語法錯誤:接近意外的標記'ac_config_headers =」$ ac_config_headers config.h「' – garyp