IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Qt的跨平台与pro工程文件输出设定 -> 正文阅读

[系统运维]Qt的跨平台与pro工程文件输出设定

版本记录表 (1)

跨平台代码

在Pro文件中区分

在工程文件中,使用unixwin32macx等标号区分不同的平台。可以使用标号+冒号的形式指定单行内容在特定平台生效,也可以使用大括号选择多行内容在特定平台生效。注意使用多行选择时,左大括号和平台名需要在同一行中,否则会失效。

  • 单行写法示例:
macx:!qesp_mac_framework:CONFIG += absolute_library_soname

unix:QT = core
else:QT = core gui
  • windows平台多行写法示例:
//统一Windows平台的方法
win32 {
  
}
 
//仅msvc编译器
win32-msvc*{
 
}
  • Linux或unix平台多行写法示例:
统一Linux或unix平台写法
unix {
 
}
 
//仅g++编译器
linux-g++*{
 
}
  • macOS平台多行写法示例:
macx {
    
}

macx:qesp_mac_framework {

}

需要特别注意的是,macOS平台也是unix平台的一种,因此上述Linux或unix平台写法也包含了macOS系统。如果要指定非macOS系统的Unix平台,那么需要使用如下写法:

unix:!macx {

}

在代码中区分

使用宏定义选择不同平台进行条件编译。不同平台的宏定义使用示例如下:

#if defined Q_OS_DARWIN     //Q_OS_MAC
    qputenv("QT_MAC_WANTS_LAYER", "1");
#elif defined Q_OS_LINUX    //Q_OS_LINUX

#elif defined Q_OS_WIN32    // Q_OS_WIN32

#else

#endif

pro工程输出

Release与Debug控制

Release编译与Debug编译的选择同样分为单行指定和多行指定。单行指定的示例如下:

CONFIG(debug, debug|release):LIBS += -L../lib1 -lhellod
CONFIG(release, debug|release):LIBS += -L../lib2 -lhello

多行指定的示例如下:

CONFIG(debug, debug|release){
    
} else {
    
}

之所以采用CONFIG(debug, debug|release)这样的写法,主要是因为要确保只能有一个条件处于active的状态。两个参数,前者是要判断的active的选项,后者是互斥的选项的一个集合。

Qt Creator的构建配置中除了Debug与Release之后,还有Profile。Qt在qmake项目.pro文件时,会将Profile配置视作Release配置解析

编译生成文件

TARGET:这个配置项用来指定最后生成的目标应用程序的名称。

DESTDIR:设置目标文件的输出目录(如exe或lib文件)。

OBJECTS_DIR:放置obj中间文件的目录。

MOC_DIR: moc转换文件的路径。

RCC_DIR: 资源文件的路径。

UI_DIR:ui文件转换的路径。

使用示例1:

win32:CONFIG(release, debug|release):{
    DESTDIR = $$PWD/release
    UI_DIR = $$PWD/tmp/release/ui
    MOC_DIR = $$PWD/tmp/release/moc
    OBJECTS_DIR = $$PWD/tmp/release/obj
    RCC_DIR = $$PWD/tmp/release/rcc
}
else:win32:CONFIG(debug, debug|release):{
    DESTDIR = $$PWD/debug
    UI_DIR = $$PWD/tmp/debug/ui
    MOC_DIR = $$PWD/tmp/debug/moc
    OBJECTS_DIR = $$PWD/tmp/debug/obj
    RCC_DIR = $$PWD/tmp/debug/rcc
}

使用示例2:

CONFIG(debug, debug|release) {
    build_type = debug
} else {
    build_type = release
}
 
DESTDIR     = $$build_type/out
OBJECTS_DIR = $$build_type/obj
MOC_DIR     = $$build_type/moc
RCC_DIR     = $$build_type/rcc
UI_DIR      = $$build_type/ui

执行系统命令

使用**QMAKE_PRE_LINKQMAKE_POST_LINK定义需要在编译前与编译后需要执行的系统命令。一般可以利用此功能将一些依赖的头文件、库文件等复制到指定的目录中。**执行多条系统命令时,从第二条命令开始要加上“&&”作为分隔,否则会导致命令执行失败。示例如下:

win32 {
    QT_PROJ_ROOTDIR = E:/Working/QtDev

    # Copy the interface file of the plugin to the folder
    InterfaceFile = $$PWD/ipluginmanager.h
    # 将LibFile中的"/"替换为"\"
    InterfaceFile = $$replace(InterfaceFile, /, \\)

    # Copy the library of the plugin to the folder
    LibraryFile = $$DESTDIR/EWhalesPluginManager.dll
    # 将LibFile中的"/"替换为"\"
    LibraryFile = $$replace(LibraryFile, /, \\)

    # 输出目录也是一样,要将"/"替换为"\"
    OutLibFile = $$QT_PROJ_ROOTDIR/Plugins/
    OutLibFile = $$replace(OutLibFile, /, \\)

    QMAKE_POST_LINK += "copy $$InterfaceFile $$OutLibFile"
    QMAKE_POST_LINK += "&& copy $$LibraryFile $$OutLibFile"
}

完整示例

在实际的项目工程文件中,会同时使用操作系统选择、构建类型选择、指定输出目录、编译后命令执行等功能。为了规范多个项目的编译输出框架,可以使用子项目包含的形式。在子项目中制定好编译输出的一般规则,并使多个工程文件都包含同一个子项目(.pri文件)。以下提供一个来源于真实项目的完整示例。

  • 通用子项目文件
CONFIG(debug, debug|release) {
    build_type = debug
} else {
    build_type = release
}

DESTDIR     = ../output/$$build_type
OBJECTS_DIR = ./$$build_type/obj
MOC_DIR     = ./$$build_type/moc
RCC_DIR     = ./$$build_type/rcc
UI_DIR      = ./$$build_type/ui

# 指的是当前正在解析的.pro文件的目录的完整路径。 
# 在编写支持影子构建的项目文件时,PWD很有用。
message(PWD is: $$PWD)
# 指的是qmake生成的Makefile的目录的完整路径,即构建目录。
# 例如build-??-Desktop_Qt_5_12_8_MSVC2017_64bit-Debug
message(OUT_PWD is: $$OUT_PWD)
# 正在使用的项目文件的路径
message(_PRO_FILE_ is: $$_PRO_FILE_)
# 包含目录的路径,该目录包含正在使用的项目文件
message(_PRO_FILE_PWD_ is: $$_PRO_FILE_PWD_)
  • 具体工程文件
include(./ewhales_qt.pri)

QT       += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

unix:QMAKE_CXXFLAGS += -std=c++11
TARGET = EWhalesPluginManager
TEMPLATE = lib
#TEMPLATE = app

CONFIG             += plugin

SOURCES += main.cpp\
    pluginmanager.cpp \
    pluginmanager.settings.cpp \
    pluginmanager.updater.cpp \
    pluginmanager_panel.cpp \
    pluginmanager_panel.uislots.cpp

HEADERS  += \
    ipluginmanager.h \
    pluginmanager.h

FORMS    += \
    pluginmanager_panel.ui

INCLUDEPATH += ../lib
INCLUDEPATH += ../../Plugins

#win32:LIBS             += -lsetupapi -ladvapi32 -luser32

win32 {
    QT_PROJ_ROOTDIR = E:/Working/QtDev

    #### Copy the interface file of the plugin to the folder ####
    InterfaceFile = $$PWD/ipluginmanager.h
    # 将LibFile中的"/"替换为"\"
    InterfaceFile = $$replace(InterfaceFile, /, \\)

    #### Copy the library of the plugin to the folder ####
    LibraryFile = $$DESTDIR/EWhalesPluginManager.dll
    # 将LibFile中的"/"替换为"\"
    LibraryFile = $$replace(LibraryFile, /, \\)

    # 输出目录也是一样,要将"/"替换为"\"
    OutLibFile = $$QT_PROJ_ROOTDIR/Plugins/
    OutLibFile = $$replace(OutLibFile, /, \\)

    QMAKE_POST_LINK += "copy $$InterfaceFile $$OutLibFile"
    QMAKE_POST_LINK += "&& copy $$LibraryFile $$OutLibFile"
}

unix:!macx {
    QT_PROJ_ROOTDIR = /home/alwhales/QtDev

    #### Copy the interface file of the plugin to the folder ####
    InterfaceFile = $$PWD/ipluginmanager.h

    #### Copy the library of the plugin to the folder ####
    LibraryFile = $$DESTDIR/libEWhalesPluginManager.so

    # 输出目录也是一样,要将"/"替换为"\"
    OutLibFile = $$QT_PROJ_ROOTDIR/Plugins/

    QMAKE_POST_LINK += "cp $$InterfaceFile $$OutLibFile"
    QMAKE_POST_LINK += "&& cp $$LibraryFile $$OutLibFile"
}

macx {
    QT_PROJ_ROOTDIR = /Users/wangtao/QtProj

    #### Copy the interface file of the plugin to the folder ####
    InterfaceFile = $$PWD/ipluginmanager.h

    #### Copy the library of the plugin to the folder ####
    LibraryFile = $$DESTDIR/libEWhalesPluginManager.dylib

    # 输出目录也是一样,要将"/"替换为"\"
    OutLibFile = $$QT_PROJ_ROOTDIR/Plugins/

    QMAKE_POST_LINK += "cp $$InterfaceFile $$OutLibFile"
    QMAKE_POST_LINK += "&& cp $$LibraryFile $$OutLibFile"
}

RESOURCES += \
    resource.qrc

HEADERS += \
    pluginmanager_panel.h

include ($$PWD/update_tool/qsimpleupdater/QSimpleUpdater.pri)

最终的项目目录结构为:

在这里插入图片描述

参考资料1:https://blog.csdn.net/libaineu2004/article/details/104756713/

参考资料2:https://libaineu2004.blog.csdn.net/article/details/89366925

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:32:30  更:2022-04-01 00:36:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:27:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码