2009-04-29 54 views
9

是否有任何方式通過qmake獲取用戶使用的編譯器的版本和供應商?我需要的是在使用g ++ 3.x時禁用構建項目的某些目標,並在使用g ++ 4.x時啓用它們。使用qmake查找編譯器供應商/版本

更新:大多數答案都針對預處理器。這是我想避免的。我不想爲特定的編譯器版本構建目標,我希望由構建系統做出這個決定。

回答

13

除了ashcatch的回答,qmake讓你query the command line並獲得迴應作爲一個變量。所以,你可以到這樣的事情:

linux-g++ { 
    system(g++ --version | grep -e "\<4.[0-9]") { 
     message("g++ version 4.x found") 
     CONFIG += g++4 
    } 
    else system(g++ --version | grep -e "\<3.[0-9]") { 
     message("g++ version 3.x found") 
     CONFIG += g++3 
    } 
    else { 
     error("Unknown system/compiler configuration") 
    } 
} 

後來的後來,當你想用它來指定目標,您可以使用配置範圍規則:

SOURCES += blah blah2 blah3 
g++4: SOURCES += blah4 blah5 
+0

完美的感謝簡單的提取主版本號。我正在考慮做這樣的事情,但是我想我會問是否有一些已經支持的東西。因爲顯然你的解決方案並不準備使用:-) – 2009-05-03 10:49:14

+0

@Caleb:如果你使用`gcc -dumpversion`命令,可能會導致grep冗餘,這可能會導致簡化。我可以編輯你的答案嗎?還是我應該寫另一個答案? – user23573 2015-05-01 10:57:49

0

每個編譯器供應商都使用它來定義一些標識編譯器和版本的特定符號。你可以使用這些符號進行檢查。

例如,我知道_MSC_VER給出了Microsoft C++編譯器的版本。

我也知道Boost Libraries使用這種特性選擇和適應。

您可以看一下在include文件夾中找到的Boost Config頭文件,路徑爲boost/config/*,特別是在select_compiler_config.hpp。

通過使用這些編譯器特定的符號,您可以在構建代碼的預處理階段進行特徵選擇。

2

作爲一個開始,我會看在確定範圍的功能,qmake的支持:

Scopes and Conditions

但是當我讀到它,它似乎在默認情況下,你可以使用一般的平臺條件像win32unix或者您可以使用qmake規範的名稱,如linux-g++。你可以像這樣測試Visual Studio版本(因爲不同的Visual Studio版本使用不同的qmake規範),但我認爲你不能像這樣測試gcc版本(至少我不知道如何)。

0

以下宏是在我的版本gcc和g ++

#define __GNUC__ 4 
#define __GNUC_MINOR__ 0 
#define __GNUC_PATCHLEVEL__ 1 

的定義Additionaly的G ++定義:

#define __GNUG__ 4 
1

我做

isEmpty(MGWVER) { 
    MGW_MAJ = $$system(echo | gcc -dM -E - | fgrep __GNUC__ | cut -d\" \" -f 3) 
    MGW_MIN = $$system(echo | gcc -dM -E - | fgrep __GNUC_MINOR__ | cut -d\" \" -f 3) 
    MGWVER =$$MGW_MAJ$$MGW_MIN 
    message(MGWVER $$MGWVER) 
} 

它返回「48」。 我用它連接正確Boost庫:

USER_BOOST_CFG=mgw$${MGWVER}-mt-s-$$(BOOST_VER) 
message($$USER_BOOST_CFG) 
LIBS *= -L$$(BOOST_ROOT)/lib 
LIBS *= -L$$(BOOST_ROOT)/stage/lib 

LIBS *= -lboost_system-$$USER_BOOST_CFG 
LIBS *= -lboost_filesystem-$$USER_BOOST_CFG 
LIBS *= -lboost_date_time-$$USER_BOOST_CFG 

可以有效提供: -lboost_system-mgw48-MT-S-1_54

我在MinGW的。

另一個想法是看QMAKESPEC vaariable並從中分析,提示:

message(QMAKESPEC $$QMAKESPEC) 
SPLITED=$$section(QMAKESPEC, "/", 0, -3) 
message(SPLITED $$SPLITED) 
3

我基於Caleb Huitt - cjhuitt的答案。但他的方法對我不起作用。

*-g++ { 
    GCC_VERSION = $$system("g++ -dumpversion") 
    contains(GCC_VERSION, 6.[0-9]) { 
     message("g++ version 6.x found") 
     CONFIG += g++6 
    } else { 
     contains(GCC_VERSION, 5.[0-9]) { 
      message("g++ version 5.x found") 
      CONFIG += g++5 
     } else { 
      contains(GCC_VERSION, 4.[0-9]) { 
       message("g++ version 4.x found") 
       CONFIG += g++4 
      } else { 
       message("Unknown GCC configuration") 
      } 
     } 
    } 
} 

正如您所看到的,您可以從GCC獲取版本,然後將其與正則表達式進行比較。

如何使用的方式是一樣的:

SOURCES += blah blah2 blah3 
g++4: SOURCES += blah4 blah5 
0

我的答案是基於dismine's answer
我們可以使用$$ str_member

gcc | clang { 
    COMPILER_VERSION = $$system($$QMAKE_CXX " -dumpversion") 
    COMPILER_MAJOR_VERSION = $$str_member($$COMPILER_VERSION) 
    greaterThan(COMPILER_MAJOR_VERSION, 3): message("gcc 4 or later") 
    greaterThan(COMPILER_MAJOR_VERSION, 4): message("gcc 5 or later") 
    greaterThan(COMPILER_MAJOR_VERSION, 5): message("gcc 6 or later") 
    greaterThan(COMPILER_MAJOR_VERSION, 6): message("gcc 7 or later") 
} 
相關問題