一、识别编译器

win32-msvc*{
DEFINES += COMPILE_MSVC
}else{
win32-g++{
DEFINES += COMPILE_MINGW32
DEFINES += PJ_AUTOCONF=1
DEFINES += PJ_IS_BIG_ENDIAN=0
DEFINES += PJ_IS_LITTLE_ENDIAN=1
}else{
DEFINES += COMPILE_LINUX
if(contains(QMAKE_CXX,g++)){
DEFINES += COMPILE_UBUNTU
}
if(contains(QMAKE_CXX,aarch64-linux-gnu-g++)){
DEFINES += COMPILE_KYLIN
}
}
}

对于win32-msvc以及win32-g++

 

 

QT会在编译的时候将这个选项加入,在pro文件中可以直接拿来识别

在linux下可以直接通过查看编译器

contains(QMAKE_CXX,g++) //X86_64平台

contains(QMAKE_CXX,aarch64-linux-gnu-g++) //aarch64平台(飞腾加银河麒麟),因为是交叉编译所以QMAKE是用aarch64-linux-gnu-g++编译出来的

这样就能精确的知道在哪个平台哪个编译器

二、条件编译

其中DEFINES += COMPILE_MSVC

DEFINES += COMPILE_MINGW32

DEFINES += COMPILE_LINUX

DEFINES += COMPILE_KYLIN

在pro中使用DEFINES来实现条件编译

Qt的pro文件中使用DEFINES 来实现类似gcc -D的条件编译功能。

在生成的makefile中,可以看到编译宏

DEFINES = ... -COMPILE_MSVC...
CXXFLAGS = ... $(DEFINES) ...
...

在整个工程中都可以使用这些宏

#if defined(COMPILE_MSVC)
#else
#include "play_mp4.h"
#include "CLog_c.h"
#endif
#if defined(COMPILE_MSVC)
m_mediaPlayer = new QMediaPlayer(this, QMediaPlayer::VideoSurface);
connect(m_mediaPlayer, SIGNAL(durationChanged(qint64)), this,SLOT(durationChanged(qint64)));
#endif

使用这种宏可以在程序中进行条件编译

三、

win32-msvc*{
DESTDIR += $$PWD/../build/msvc/run
}else{
win32-g++{
DESTDIR += $$PWD/../build/mingw32/run
}else{
if(contains(QMAKE_CXX,g++)){
DESTDIR += $$PWD/../build/ubuntu/bin
}
if(contains(QMAKE_CXX,aarch64-linux-gnu-g++)){
DESTDIR += $$PWD/../build/aarch64/bin
}
}
}

DESTDIR 是一个目标程序的生成目录,最终的目标文件生成后会存放到这个路径下

pro文件加入下面这句

DEFINES += KJorLJ=0
if(KJorLJ == 1)
ui->pushButton_2->setStyleSheet("background-color: rgb(6, 60, 132); color: rgb(255, 255, 255);");
else
ui->pushButton_2->setStyleSheet("background-color:rgb(6, 91, 50);color:rgb(255, 255, 255);");

可以实现不同的功能

所以DEFINES 就是在pro文件中定义的宏,这个宏是一个全局的,程序中也可使用

#if defined(ARM_ARCH) //如果是在开发板上运行,那么需要隐藏鼠标指针
QApplication::setOverrideCursor(Qt::BlankCursor); // 隐藏鼠标
#endif

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐