有没有办法通过qmake获取用户使用的编译器的版本和厂商?我需要的是在使用 g++ 3.x 时禁用构建我的项目的一些目标,并在使用 g++ 4.x 时启用它们。
更新:大多数答案都针对预处理器。这是我想避免的。我不希望为特定的编译器版本构建目标,我希望由构建系统做出这个决定。
有没有办法通过qmake获取用户使用的编译器的版本和厂商?我需要的是在使用 g++ 3.x 时禁用构建我的项目的一些目标,并在使用 g++ 4.x 时启用它们。
更新:大多数答案都针对预处理器。这是我想避免的。我不希望为特定的编译器版本构建目标,我希望由构建系统做出这个决定。
除了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
我的回答基于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
首先,我会看一下 qmake 支持的作用域功能:
但是当我读到它时,似乎默认情况下您可以使用一般平台条件,例如win32
orunix
或者您可以使用 qmake 规范的名称,例如linux-g++
. 您可以像这样测试 Visual Studio 版本(因为不同的 Visual Studio 版本使用不同的 qmake 规范),但我认为您不能像这样测试 gcc 版本(至少我不知道如何)。
我的回答是基于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")
}
我愿意
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)
每个编译器供应商都使用定义一些特定的符号来标识编译器和版本。您可以使用这些符号进行检查。
例如,我知道 _MSC_VER 提供了 Microsoft C++ 编译器的版本。
我还知道 Boost Libraries 使用这种特征选择和适应。
您可以查看包含文件夹中的 Boost Config 标头,位于路径: boost/config/* ,特别是在 select_compiler_config.hpp。
通过使用这些编译器特定的符号,您可以在构建代码的预处理阶段进行特征选择。
在我的 gcc 和 g++ 版本中定义了以下宏
#define __GNUC__ 4
#define __GNUC_MINOR__ 0
#define __GNUC_PATCHLEVEL__ 1
另外 g++ 定义:
#define __GNUG__ 4