内容预览
1.预处理命令(#ifdef,#else,#endif,#if,#ifndef)
2.如何在QT程序中区分不同编译器类型
3.如何在QT pro文件中区分不同编译器类型
一、预处理命令
1.1#ifdef
#ifdef的作用是判断某个宏是否定义,如果该宏已经定义则执行后面的代码
一般使用格式如下
#ifdef 宏名
程序段1
#else
程序段2
#endif
它的意思是,如果该宏已被定义过,则对程序段1进行编译,否则对程序段2进行编译,上述格式也可以不用#else,和if、else类似
1.2#ifndef
#ifndef恰好和#ifdef相反
#ifndef 宏名
程序段1
#else
程序段2
#endif
它的意思是,如果该宏未被定义,则对“程序段1”进行编译,否则对“程序段2”进行编译
1.3#if(条件编译)
#if的使用和if else的使用非常相似,一般使用格式如下
#if 整型常量表达式1
程序段1
#elif 整型常量表达式2
程序段2
#else
程序段3
#endif
它的意思是,如果整形常量表达式为真,则执行程序段1,否则继续往后判断依次类推,最后#endif是#if的结束标志。
二、在QT程序中区分不同编译器类型
使用情况,例如我们程序需要能支持在多个平台、多个编译环境,有时就需要对当前编译器做判断。
2.1区分Linux、MSVC、MINGW编译器
方法一:
#include <QtGlobal>
#if defined(Q_OS_UNIX)
qDebug() << "这是linux环境";
#elif defined(Q_CC_MSVC)
qDebug() << "这是win-MSVC环境";
#elif defined(Q_CC_MINGW)
qDebug() << "这是win-MINGW环境";
#endif
...
区分arm/linux/windows
#ifdef Q_OS_MAC
// mac
#endif
#ifdef __ARM_ARCH
// arm
qDebug() << "__ARM_ARCH";
#else
// linux
qDebug() << "Q_OS_LINUX";
#endif
#ifdef Q_OS_WIN32
// win
#endif
方法二:
#ifdef Q_OS_UNIX
qDebug() << "这是linux环境";
#endif
#ifdef Q_CC_MSVC && _MSC_VER > 1500
qDebug() << "这是win-MSVC环境";
#endif
#ifdef Q_CC_MINGW
qDebug() << "这是win-MINGW环境";
#endif
2.2 判断MSVC编译器版本
注意上面代码提到的 _MSC_VER > 1500 可以分解为:
MS:Microsoft的简写。
C:MSC就是Microsoft的C编译器。
VER:Version的简写。
> 1500: 支持MSVC2008以后的版本(具体参考下表)
MS VC++ 14.0 _MSC_VER = 1900 (Visual C++ 2015)
MS VC++ 12.0 _MSC_VER = 1800 (Visual C++ 2013)
MS VC++ 11.0 _MSC_VER = 1700 (Visual C++ 2012)
MS VC++ 10.0 _MSC_VER = 1600 (Visual C++ 2010)
MS VC++ 9.0 _MSC_VER = 1500 (Visual C++ 2008)
MS VC++ 8.0 _MSC_VER = 1400 (Visual C++ 2005)
MS VC++ 7.1 _MSC_VER = 1310 (Visual C++ 2003)
MS VC++ 7.0 _MSC_VER = 1300 (Visual C++ 2002)
三、在QT pro文件 中区分不同编译器类型
3.1区分是x86架构还是x64架构、区分是debug版本还是release版本
greaterThan(QT_MAJOR_VERSION,4){
TARGET_ARCH=$${QT_ARCH}
}else{
TARGET_ARCH=$${QMAKE_HOST.arch}
}
contains(TARGET_ARCH, x86_64){
message('64')
CONFIG(debug,debug|release){
message('debug')
}else{
message('release')
}
}else{
message('32')
CONFIG(debug,debug|release){
message('debug')
}else{
message('release')
}
}
执行效果如图
区分linux/arm
contains(QT_ARCH, arm64){
message("arm64") #在这里处理arm64所需
}else{
message("x86")
}
3.2QT4通过DEFINES 方法实现条件编译功能
unix指在ubuntu编译环境,win32指在windows编译环境。
DEFINES定义条件编译宏
unix{
#定义条件编译宏_m_mARM
DEFINES += _m_mARM
#DEFINES += _m_LINUX_86 _LINUX_64
#依赖编译宏_m_mARM的编译选项
if(contains(DEFINES,_m_mARM)) {
message('m_mARM')
}
if(contains(DEFINES,_m_LINUX_86)) {
message('_m_LINUX_86')
}
}
win32{
DEFINES += _m_WINGW
#DEFINES += _m_MSVC
if(contains(DEFINES,_m_mARM)) {
message('m_mARM')
}
if(contains(DEFINES,_m_LINUX_86)) {
message('_m_LINUX_86')
}
}
3.3 QT5通过方法实现条件编译功能
#QT_ARCH是Qt5新增的,在Qt4上没效果
#打印当前Qt构建套件的信息
message($$QT_ARCH)
#表示arm平台构建套件
contains(QT_ARCH, arm) {message('this is ARM')}
#表示32位的构建套件
contains(QT_ARCH, i386) {message('this is i386')}
#表示64位的构建套件
contains(QT_ARCH, x86_64) {message('this is x86_64')}
四、判断Qt版本
1.pro中
#打印版本信息
message(qt version: $$QT_VERSION)
#判断当前qt版本号
QT_VERSION = $$[QT_VERSION]
QT_VERSION = $$split(QT_VERSION, ".")
QT_VER_MAJ = $$member(QT_VERSION, 0)
QT_VER_MIN = $$member(QT_VERSION, 1)
#下面是表示 Qt5.5及以上版本
greaterThan(QT_VER_MAJ, 4) {
greaterThan(QT_VER_MIN, 4) {
#自己根据需要做一些处理
}}
2.程序中
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
//要做的处理
#endif
//下面表示 >= 5.9.7
#if QT_VERSION >= 0x050907
...
#endif
//下面表示 < 5.12.10
#if QT_VERSION < 0x050C0A
...
#endif