使用qmake查找编译器供应商/版本

时间:2009-04-29 07:38:23

标签: c++ qt build-process makefile qmake

有没有办法通过qmake获取用户使用的编译器的版本和供应商?我需要的是在使用g ++ 3.x时禁用构建项目的某些目标,并在使用g ++ 4.x时启用它们。

更新:大多数答案都针对预处理器。这是我想要避免的。我不希望为特定的编译器版本构建目标,我希望由构建系统做出这个决定。

7 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

我的回答基于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

答案 2 :(得分:2)

首先,我将看看qmake支持的范围界定功能:

Scopes and Conditions

但是当我读到它时,似乎默认情况下您可以使用win32unix等常规平台条件,或者您可以使用qmake规范的名称,例如linux-g++。您可以像这样测试Visual Studio版本(因为不同的Visual Studio版本使用不同的qmake规范),但我不认为您可以像这样测试gcc版本(至少我不知道如何)。

答案 3 :(得分: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变量并从中解析,提示:

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

答案 4 :(得分:1)

我的回答基于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")
}

答案 5 :(得分:0)

每个编译器供应商用于定义一些标识编译器和版本的特定符号。您可以使用这些符号进行检查。

我知道,例如,_MSC_VER提供了Microsoft C ++编译器的版本。

我也知道Boost Libraries使用这种特征选择和改编。

您可以在路径:boost / config / *上查看包含文件夹中的Boost Config标头,特别是在select_compiler_config.hpp。

通过使用这些编译器特定符号,您可以在构建代码的预处理阶段进行特征选择。

答案 6 :(得分:0)

我的gcc和g ++版本中定义了以下宏

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

另外g ++定义:

#define __GNUG__ 4