2009-04-29 45 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") 
}