首页 资讯 > 内容页

QT中如何识别编译器和实现条件编译以及设定目标文件生成路径

时间 : 2023-04-09 15:02:49 来源:QT教程

一、识别编译器

win32-msvc*{DEFINES += COMPILE_MSVC}else{win32-g++{DEFINES += COMPILE_MINGW32DEFINES += PJ_AUTOCONF=1DEFINES += PJ_IS_BIG_ENDIAN=0DEFINES += PJ_IS_LITTLE_ENDIAN=1}else{DEFINES += COMPILE_LINUXif(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);\");elseui->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

【领 QT开发教程 学习资料, 点击下方链接莬费领取↓↓ ,先码住不迷路~】

点击这里:

x