Qt中多pro项目配置详解1. 主pro文件2. 库pro文件3. 应用程序pro文件4. 生成库与namespace(1). libxxx.h(2). libxxx.cpp5. 测试:可执行文件使用生成的库
一个项目包含多个pro子模块,qmake负责转换pro文件,生成Makefile文件:自动进入SUBDIRS列出的各个子目录,依次对pro文件执行qmake命令,生成各个子目录的Makefile。
x
# 比如:executableproj生成的应用程序需要使用libraryproj生成的库。TEMPLATE = subdirs# SUBDIRS表示子项目 SUBDIRS = libraryproj \ executableproj# depends设置构建顺序,官方已不推荐CONFIG += ordered形式,构建速度慢 executableproj.depends = libraryprojx
# 库需要区分:debug版还是release版,windows平台区分导入还是导出,生成库还是可执行文件,32位还是64位QT -= guiCONFIG += c++11# 生成库TEMPLATE = libDEFINES += QT_DEPRECATED_WARNINGSDEFINES += XXX_LIBRARY # 如果是构建库,则定义这个宏,用于区分库还是可执行文件
SOURCES += \ xxx.cpp
HEADERS += \ xxx.h # 为库添加rpath为当前目录 ==> 方便移植QMAKE_LFLAGS += '-Wl,-rpath,\'\$$ORIGIN\''
# 库名TARGET = xxx# 库输出目录DESTDIR = $$PWD/../lib# 库版本号win32:VERSION = 1.0.0.0 # major.minor.patch.buildelse:VERSION = 1.0.0 # major.minor.patch
# win需要区分导入还是导出,与linux不同win32{ DEFINES *= CUTEAPI_LIBRARY}# 区分debug,releaseCONFIG(debug, debug|release) { TARGET = $$join(TARGET,,,d) #为debug版本生成的文件增加d的后缀}# 区分32位和64位系统contains(QT_ARCH, i386){ TARGET = $$join(TARGET,,,-x86)}contains(QT_ARCH, x86_64){ TARGET = $$join(TARGET,,,-x64)}x
QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11DEFINES += QT_DEPRECATED_WARNINGS
# 包含pri文件include (xxx.pri)RESOURCES += xxx.qrcTEMPLATE = appTARGET = xxx# 头文件搜索目录INCLUDEPATH += xxxDEPENDPATH += xxx# 应用程序输出目录DESTDIR = $$PWD/../bin
# 为可执行文件添加rpath为当前目录 ==> 方便移植QMAKE_LFLAGS += '-Wl,-rpath,\'\$$ORIGIN\''
# 区分链接debug还是release库CONFIG(debug, debug|release) {
LIBS += \ -L"$$PWD/../lib" \ -lxxxd } else { LIBS += \ -L"$$PWD/../lib" \ -lxxx} 自定义库需要使用命名空间进行符号管理,解决重名等问题。
命名空间的保护范围应该仅仅是需要引出的类或接口,需要排除include语句
xxxxxxxxxx
//windows区分导入导出:当dll使用时为导出,当exe使用时为导入 //__declspec(dllexport) //__declspec(dllimport) //linux
namespace nspxxx{/*namespace nspxxx start*/... //导出类 class XXX_EXPORT xxx { public: xxx(); void test(); }; //导出函数 XXX_EXPORT int test(int size);.../*namespace nspxxx stop*/}
// LIBXXX_H
xxxxxxxxxxnamespace nsp_cuteapi {/*namespace nsp_cuteapi start*/.../*namespace nsp_cuteapi stop*/}
xxxxxxxxxx
//1. 添加头文件//using namespace nspxxx; //不建议MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow){ ui->setupUi(this); int ret = nspxxx::test(100); //2. 使用命名空间::形式使用 qDebug() << __FILE__ << __FUNCTION__ << __LINE__ << ret;
}
MainWindow::~MainWindow(){ delete ui;}