QT 区分编译器类型

内容预览

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jbyyy、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值