版本记录表 (1)
跨平台代码
在Pro文件中区分
在工程文件中,使用unix 、win32 、macx 等标号区分不同的平台。可以使用标号+冒号的形式指定单行内容在特定平台生效,也可以使用大括号选择多行内容在特定平台生效。注意使用多行选择时,左大括号和平台名需要在同一行中,否则会失效。
macx:!qesp_mac_framework:CONFIG += absolute_library_soname
unix:QT = core
else:QT = core gui
win32 {
}
win32-msvc*{
}
统一Linux或unix平台写法
unix {
}
linux-g++*{
}
macx {
}
macx:qesp_mac_framework {
}
需要特别注意的是,macOS平台也是unix平台的一种,因此上述Linux或unix平台写法也包含了macOS系统。如果要指定非macOS系统的Unix平台,那么需要使用如下写法:
unix:!macx {
}
在代码中区分
使用宏定义选择不同平台进行条件编译。不同平台的宏定义使用示例如下:
#if defined Q_OS_DARWIN
qputenv("QT_MAC_WANTS_LAYER", "1");
#elif defined Q_OS_LINUX
#elif defined 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_LINK 和QMAKE_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
|