10

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

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

4

7 回答 7

15

除了ashcatch的答案之外,qmake还允许您查询命令行并将响应作为变量返回。所以你可以这样:

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
于 2009-04-30T15:08:06.927 回答
7

我的回答基于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
于 2016-08-07T10:41:42.527 回答
2

首先,我会看一下 qmake 支持的作用域功能:

范围和条件

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

于 2009-04-29T10:33:39.153 回答
2

我的回答是基于dismine 的回答
我们可以简单地使用 $$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")
}
于 2017-11-16T17:16:49.313 回答
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)
于 2013-07-04T12:29:37.417 回答
0

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

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

我还知道 Boost Libraries 使用这种特征选择和适应。

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

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

于 2009-04-29T09:16:34.440 回答
0

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

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

另外 g++ 定义:

#define __GNUG__ 4
于 2009-04-29T16:06:40.087 回答