01.pro文件详解(笔记)

1 格式说明

qmake变量含义
#xxxx注释,从"#"开始,到这一行结束
SOURCES指定源文件SOURCES = *.cpp
对于多源文件,可用空格分开SOURCE = 1.cpp 2.cpp 3.cpp
每个文件可以被列在一个分开的行里面,通过反斜线另起一行
SOURCES = hello.cpp \
main.cpp
一个更冗长的方法是单独地列出每一个文件
SOURCES += hello.cpp
SOURCES += main.cpp
HEADERS指定头文件
HEADERS = hello.h
HEADERS += hello.h
CONFIG配置信息CONFIG += qt warn_on release
编译器标志
  • release - 应用程序将以release模式连编。如果"debug"被指定,它将被忽略。
  • debug - 应用程序将以debug模式连编。
  • warn_on - 编译器会输出尽可能多的警告信息。如果"warn_off"被指定,它将被忽略。
  • warn_off - 编译器会输出尽可能少的警告信息。
连编的库/应用程序的类型:
  • qt - 应用程序是一个Qt应用程序,并且Qt库将会被连接。
  • thread - 应用程序是一个多线程应用程序。
  • x11 - 应用程序是一个X11应用程序或库。
  • windows - 只用于"app"模板:应用程序是一个Windows下的窗口应用程序。
  • console - 只用于"app"模板:应用程序是一个Windows下的控制台应用程序。
  • dll - 只用于"lib"模板:库是一个共享库(dll)。
  • staticlib - 只用于"lib"模板:库是一个静态库。
  • plugin - 只用于"lib"模板:库是一个插件,这将会使dll选项生效。
TARGET指定目标文件名;如果不设置该项目,目标名会被自动设置为跟项目文件一样的名称TARGET = filename
INTERFACES添加界面文件(ui)INTERFACES = filename.ui
TEMPLATE
模块设置
app(生成应用程序,默认)
subdirs(生成makefile文件编译,subdirs指定的子文件夹)
lib(生成库文件)
TEMPLATE = app
DESTDIR指定生成的应用程序放置的目录DESTDIR += ../bin
UI_DIR制定uic命令将.ui文件转换成ui_*.h文件的存放的目录UI_DIR += forms
RCC_DIR指定rcc命令将.qrc文件转换成qrc_*.h文件的存放目录RCC_DIR += ../tmp
MOC_DIR指定moc命令将含Q_OBJECT的头文件转换成标准.h文件的存放目录MOC_DIR += ../tmp
OBJECTS_DIR指定目标文件的存放目录OBJECTS_DIR += ../tmp
DEPENDPATH程序编译时依赖的相关路径DEPENDPATH += . forms include qrc sources
INCLUDEPATH头文件包含路径INCLUDEPATH += .
CODECFORSRC源文件编码方式CODECFORSRC = GBK
FORMS工程中包含的.ui设计文件FORMS += forms/painter.ui
RESOURCES工程中包含的资源文件RESOURCES += qrc/painter.qrc
win32{...}
unix{...}
平台相关性处理
win32 {
SOURCES += hello_win.cpp
}
LANGUAGELANGUAGE = c++
exists
!exists
如果一个文件不存在,停止qmake
!exists( main.cpp ) {
error("No main.cpp file found")
}
QT加入库模块Qt += xml
LIBS
LIBS += -L folderPath //引入的lib文件的路径 -L:引入路径
LIBS += -lLibName //引入lib文件 -l:引入库
LIBS += -L"$(OutDir)" \
-L"$(SolutionDir)lib" \
-lopengl32 \
-lglu32 \
-lObjectDbAPI \
-lGraphicsLibD

1.1 模板变量 TEMPLATE

模板变量作用告诉qmake为这个应用程序具体生成哪种makefile。下面是模板变量可供选择的值:

  • app模板变量的默认值。建立一个应用程序的makefile
  • lib建立一个库的makefile
  • vcapp建立一个应用程序的Visual Studio项目文件。
  • vclib建立一个库的VisualStudio项目文件。
  • subdirs这是一个特殊的模板,它可以创建一个能够进入特定目录且为一个项目文件生成makefile,还能为它再调用makemakefile

模板变量值不同,生成的makefile文件也会随之改变。那么,默认的同时是最常用的app值。

1.1.1 app模板

app模板告诉qmake为建立一个应用程序生成一个makefile

当使用这个模板时,设置下面这些qmake系统变量值是最有效的。可以在你的.pro文件中使用它们为你的应用程序指定特定信息。

  • HEADERS - 应用程序中的所有头文件的列表。
  • SOURCES - 应用程序中的所有源文件的列表。
  • FORAMS - 应用程序中的所有.ui文件(由Qt设计器生成)的列表。
  • LEXSOURCES - 应用程序中的所有lex源文件的列表。
  • YACCSOURCES - 应用程序中的所有yacc源文件的列表。
  • TARGET - 可执行应用程序的名称。默认值为项目文件的名称。(如果需要扩展名,会被自动添加上)
  • DESTDIR - 放置可执行程序目标的目录。
  • DEFINES - 应用程序所需的额外的预处理程序定义的列表。
  • INCLUDEPATH - 应用程序所需的额外的包含路径的列表。
  • DEPENDPATH - 应用程序所依赖的搜索路径。
  • VPATH - 寻找补充文件的搜索路径。
  • DEF_FILE - 只有Windows需要:应用程序所要连接的.def文件。
  • RC_FILE - 只有Windows需要:应用程序的资源文件。
  • RES_FILE - 只有Windows需要:应用程序所要连接的资源文件。

只需要使用那些已经有值的系统变量。例如,如果不需要任何额外的INCLUDEPATH,那么你就不需要指定它,qmake会为所需的系统变量提供默认值。

1.1.2 lib模板

lib模板告诉qmake为建立一个库而生成一个makefile。当使用这个模板时,除了app模板中提到的系统变量外,还有一个VERSION是被支持的。

你需要在为库指定特定信息的.pro文件中使用它们。

VERSION - 目标库的版本号。比如,2.3.1。

1.1.3 subdirs模板

subdirs模板告诉qmake生成一个makefile,它可以进入到特定子目录并为这个目录中的项目文件生成makefile并且为它调用make。

在这个模板中,只有一个系统变量SUBDIRS可以被识别。这个变量中包含了所要处理的含有项目文件的子目录的列表。这个项目文件的名称和子目录同名的,这样qmake就可以发现它。

例如,如果子目录是"myapp",那么在这个目录中的项目文件应该被叫做myapp.pro。

1.2 配置变量CONFIG

配置变量CONFIG 指定了编译器所要使用的选项和所需要被连接的库。配置变量中可以添加任何东西,但只有下面这些选项可以被qmake识别。

1.2.1 控制编译器

下面这些选项控制着使用哪些编译器标志:

  • release - 应用程序将以release模式连编。如果"debug"被指定,它将被忽略。
  • debug - 应用程序将以debug模式连编(与release互斥)。
  • debug_and_release - 工程同时用调试和发布模式编译。
  • build_all - 如果指定是debug_and_release模式,工程默认是同时用调试和发布模式编译。
  • ordered - 使用subdirs模板时,本选项指定了子目录应该按照给出的顺序编译。
  • warn_on - 编译器会输出尽可能多的警告信息。如果"warn_off"被指定,它将被忽略。
  • warn_off - 编译器会输出尽可能少的警告信息(与warn_on互斥)。

1.2.2 连编类型

下面这些选型定义了所要连编的库/应用程序的类型:

  • qt - 应用程序是一个Qt应用程序,并且Qt库将会别链接。
  • thread - 应用程序是一个多线程应用程序。
  • x11 - 应用程序是一个X11应用程序或库。
  • windows - 只用于"app"模板:应用程序是一个Windows下的窗口应用程序。
  • console - 只用于"app"模板:应用程序是一个Windows下的控制台应用程序。
  • dll - 只用于"lib"模板:库是一个共享库(dll)。
  • staticlib - 只用于"lib"模板:库是一个静态库。
  • plugin - 只用于"lib"模板:库是一个插件,这将会使dll选型生效。

例如,如果你的应用程序使用Qt库,并且你想把它连编为一个可调试的多线程的应用程序,项目文件应该会有下面这行:

CONFIG += qt thread debug

1.2.3 声明Qt库模块

如果CONFIG变量值中包含了qt这个值,qmake支持了qt的程序(因为qmake也可以用在非qt程序的编译),这就要调整一些程序中使用的qt的模块。

而QT变量正是达到这个目的,QT是用来声明使用到的一些额外的模块,例如:通过下面的方法使得xml和网络模块有效:

CONFIG += qt
QT += network xml

注意:默认情况下,qt包含了core和gui模块,所以上面声明仅仅是添加xml和网络模块到默认的列表中。

比如,下面的语句就是忽略了默认模块,当编译程序源码时会导致错误:

QT = network xml
#这种写法将删掉core和gui两个模块

若不需要gui模块,用"-="操作符来去除包含。

QT -= gui
#QT变量默认是有core和gui两个模块,这样写将只剩core模块被利用。

下面的罗列显示了QT变量可以使用的选项,并解释了相应的特点:

  • core(included by default)QtCore module 核心模块
  • gui(included by dufault)QtGui module 界面模块
  • network QtNetwork module 支持网络模块
  • opengl QtOpenGL module 支持opengl图像编程
  • sql QtSql module 支持sql数据库驱动
  • svg QtSvg module 支持svg矢量模块
  • xml QtXml module 支持xml模块
  • qt3support Qt3Support module 支持qt3类

注意:添加opengl到QT变量里面,等价于往CONFIG变量里添加。

所以对于Qt应用程序来说,没必要同时往QT变量和CONFIG变量里面添加opengl选项。

1.2.4 关于 CONFIG(debug,debug|release)语法

CONFIG变量可以同时定义debug和release,但只有一个处于active(当两个互斥的值都出现是,最后设置的处于active状态)。

CONFIG += debug
CONFIG += release

如上写法,release处于active状态。

上面的写法,debug和release都可以通过测试,而且阅读比较费劲,建议写法如下:

CONFIG += debug_and_realse
CONFIG(debug,debug|release){
	TARGET = proDemo_Debug
	DESTDIR = ..\demo_Debug
	# do something ......
} else {
	TARGET = proDemo_Release
	DESTDIR = ..\demo_Release
	# do something ......
}

两个参数(debug,debug|release),前者是要判断active的选项,后者是互斥的选项的一个集合。

如果想直接生成两个版本,可以直接加选项build_all。

CONFIG += debug_and_realse
CONFIG += build_all
CONFIG(debug,debug|release){
	TARGET = proDemo_Debug
	DESTDIR = ..\demo_Debug
	# do something ......
} else {
	TARGET = proDemo_Release
	DESTDIR = ..\demo_Release
	# do something ......
}

2 Qt Creator创建工程的pro文件

2.1 模板 Qt Widgets Application

新建proDemo1工程(注意:模板选择,项目:应用程序;Qt Widgets Application)。

步骤如下:

Qt Creator —> New Project —> 应用程序 —> Qt Widgets Application —> 名称为:proDemo1 —> 类信息保持不变 —> 完成。

对应的pro文件如下:

在这里插入图片描述

2.2 模板 Qt Quick Application

新建proDemo2工程(注意:模板选择,项目:应用程序;Qt Quick Application)。

步骤如下:

Qt Creator —> New Project —> 应用程序 —> Qt Quick Application —>名称为:proDemo2 —> Qt Quick component set:Qt Quick Controls1.2 —> 完成。

对应的pro文件如下:

在这里插入图片描述

此pro文件利用include引入了pri类型的文件。

2.3 Qt 控制台应用

新建proDemo3工程(注意:模板选择,项目:应用程序;Qt控制台应用)。

步骤如下:

Qt Creator —> New Project —> 应用程序 —> Qt控制台应用 —> 名称为:proDemo3 —> 类信息保持不变 —>完成。

对应的pro文件如下:

在这里插入图片描述

此pro文件去掉了CONFIG配置变量默认的app_bundle项,由于是控制台应用程序。

2.4 C++共享库

新建proDemo4工程(注意:模板选择,项目:库;C++库)。

步骤如下:

Qt Creator —> New Project —> 库 —> C++库 —> 名称为:proDemo4 —> 类型:共享库 —> 其他项均默认 —> 完成。

对应的pro文件如下:

在这里插入图片描述

此pro文件添加了unix环境的控制。

2.5 c++静态库

新建proDemo5工程(注意:模板选择,项目:库;C++库)。

步骤如下:

Qt Creator —> New Project —> 库 —> C++库 —> 名称为:proDemo5 —> 类型:静态链接库 —> 其他项均默认 —> 完成。

对应的pro文件如下:

在这里插入图片描述

此pro文件与共享库工程的最大区别是为配置变量CONFIG添加了staticlib值,因为工程类型选择为静态链接库。

2.6 C++ Plugin库

新建proDemo6工程(注意:模板选择,项目:库;C++库)。

步骤如下:

Qt Creator —> New Project —> 库 —> C++ 库 —>名称为:proDemo6 —> 类型:Qt Plugin —> 其他项均默认 —>完成。

对应的pro文件如下:

在这里插入图片描述

此pro文件添加了其他文件OTHER_FILES配置变量,另外,配置变量CONFIG添加了plugin值,因为工程类型选择为Qt Plugin。

2.7 Qt 单元测试

新建proDemo7工程(注意:模板选择,项目:其他项目;Qt单元测试)。

步骤如下:

Qt Creator —> New Project —> 其他项目 —> Qt单元测试 —> 名称为:proDemo7 —> 其他项均默认 —> 完成。

对应的pro文件如下:

在这里插入图片描述

此pro文件为Qt变量添加testlib值。

2.8 Qt4设计师自定义控件

新建proDemo8工程(注意:模板选择,项目:其他项目;Qt4设计师自定义控件)。

步骤如下:

Qt Creator —> New Project —> 其他项目 —> Qt4设计师自定义控件 —> 名称为:proDemo8—> 控件类:customControl —> 其他项全部默认 —> 完成。

对应的pro文件如下:

在这里插入图片描述

此pro文件中当Qt版本大于4.0时QT变量添加值designer。

3 Qt版本判断

3.1 在Pro文件中区分

  • 查看当前Qt版本,可以使用环境变量$$[QT_VERSION]输出,例如:

    message(Qt Version = $$[QT_VERSION])
    
  • 判断Qt的主版本号(Qt4,Qt5,Qt6),使用greaterThan或者lessThan命令。

示例1(单行指令):

# 如果版本大于Qt4(当前版本为Qt5/Qt6),则xxxx
greaterThan(QT_MAJOR_VERSION,4):xxxx

# 如果版本小于Qt5(当前版本为Qt4),则xxxx
lessThan(QT_MAJOR_VERSION,5):xxxx

示例2(多行指令):

greaterThan(QT_MAJOR_VERSION,4){
    message(Current version is Qt5 or Qt6)
}
else{
	message(Current version is Qt4)
}
  • 判断Qt的次版本号

    Qt的次版本号是指Qt版本号的第二位,例如Qt4.8、Qt5.8等,可以使用如下方法实现对Qt版本号的第二位的判断:

    # check Qt version
    QT_VERSION = $$[QT_VERSION]
    
    QT_VERSION = $$split(QT_VERSION,".")
    QT_VER_MAJ = $$member(QT_VERSION,0)
    QT_VER_MIN = $$member(QT_VERSION,1)
    
    lessThan(QT_VER_MAJ,5) | lessThan(QT_VER_MIN,6){
    	message(Qt version is less than 5.6)
    }
    else{
    	message(Qt version is greater than or equal to 5.6)
    }
    
  • 判断Qt的补丁版本号

    Qt的补丁版本号是指Qt版本号的第三位,例如Qt4.8.5、Qt5.6.1等,类似的,可以使用如下方法获取补丁的版本号的值:

    # check Qt version
    QT_VERSION = $$[QT_VERSION]
    
    QT_VERSION = $$split(QT_VERSION,".")
    QT_VER_MAJ = $$member(QT_VERSION, 0)
    QT_VER_MIN = $$member(QT_VERSION, 1)
    QT_VER_THR = $$member(QT_VERSION, 2)
    
  • 判断Qt的版本号等于某一定值

    判断版本号是否等于某一定值,可以使用如下示例:

    equals(QT_VER_MAJ,5)|equals(QT_VER_MIN,6){
        message(Qt version is equal to 5.6)
    }
    

3.2 在代码中区分

通过QT_VERSIONQT_VERSION_CHECK两个宏定义进行Qt版本判断。

  • 示例1:

    #if QT_VERSION < 0x050000
    Q_EXPORT_PLUGIN2(QTPLUGIN_SJTU_GENEMGS_IID,ISJTU_GeneMGS)
    #endif
    
  • 示例2:

    #if QT_VERSION <= QT_VERSION_CHECK(5,0,0)
    Q_EXPORT_PLUGIN2(QTPLUGIN_SJTU_GENEMGS_IID,ISJTU_GeneMGS)
    #endif
    

上述两个宏定义的展开表示如下:

/*
QT_VERSION is (major << 16) + (minor << 8) + patch
*/
#define QT_VERSION QT_VERSION_CHECK(QT_VERSION_MAJOR,QT_VERSION_MINOR,QT_VERSION_PATCH)

/*
can be used link #if (QT_VERSION >= QT_VERSION_CHECK(4,4,0))
*/
#define QT_VERSION_CHECK(major,minor,patch) ((major<<16)|(minor<<8)|(patch))

4 跨平台代码

4.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_frame{
    
    }
    

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

unix:!macx{

}

4.2 在代码中区分

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

#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

5 pro工程输出

5.1 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|relaese)这样的写法,主要是因为要确保只能有一个条件处于active的状态。两个参数,前者是要判断的active的选项,后者是互斥的选项的一个集合。

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

5.2 编译生成文件

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

5.3 执行系统命令

使用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 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"
}

5.4 完整示例

在实际的项目工程文件中,会同时使用操作系统选择、构建类型选择、指定输出目录、编译后命令执行等功能。为了规范多个项目的编译输出框架,可以使用子项目包含的形式。在子项目中制定好编译输出的一般规则,并使多个工程文件都包含同一个子项目(.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)
    

    最终的项目目录结构为:
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值