采用一个顶级工程qmake,管理两个子工程。
root:.
│ .qmake.conf
│ qtlib.pro
│
├─creator
│ creator.pro
│ mywidget.cpp
│ mywidget.h
│
└─user
main.cpp
user.pro
测试代码非常简单。但关键是需要使用Qt库中的内容。
比如这里用了最具代表的QWidget。
user/main.cpp
#include <QApplication>
#include "mywidget.h"
int main(int argc, char** argv) {
QApplication app(argc, argv);
MyWidget myWidget;
myWidget.show();
return app.exec();
}
creator/mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
class MyWidget : public QWidget {
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
};
#endif // MYWIDGET_H
creator/creator.pro
#include "mywidget.h"
#include <QDebug>
#include <QPushButton>
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
auto btn = new QPushButton{"diy-widget-lib", this};
connect(btn, &QPushButton::clicked, this,
[]() { qDebug() << "btn clicked"; });
}
top_srcdir
总工程资源目录top_builddir
总工程构建目录# 配置全局的变量
top_srcdir=$$PWD
top_builddir=$$shadowed($$PWD)
TEMPLATE = subdirs
CONFIG += ordered
,并先添加库目录
# 指定pro类型为subdirs
TEMPLATE = subdirs
# 指定子目录
# 先 creator
# 后 user
SUBDIRS += \
creator \
user
# 要求按照顺序进行编译链接
# 目的是先把库编译出来,再在user中使用库
CONFIG += ordered
message("`top_builddir`和`top_srcdir`在`.qmake.conf`文件中定义")
message($$top_builddir)
message($$top_srcdir)
TEMPLATE = lib
CONFIG += staticlib
CONFIG += dll
QT += core
QT += gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
# 指定为库类型
TEMPLATE = lib
# 静态库 staticlib
# 动态库 dll
CONFIG += staticlib
#CONFIG += dll
HEADERS += \
mywidget.h
SOURCES += \
mywidget.cpp
TEMPLATE = app
.qmake.conf
中定义的变量QT += core
QT += gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TEMPLATE = app
CONFIG += c++11
# 将库路径赋到一个变量上
# 注意静动库的前后缀区别
# 静态库
lib_path = $$top_builddir/creator/$(OBJECTS_DIR)/libcreator.a
# 动态库
#lib_path = $$top_builddir/creator/$(OBJECTS_DIR)/creator.dll
# 链接库
LIBS += $$lib_path
# 每次强制链接静态库
PRE_TARGETDEPS += $$lib_path
# 为了demo方便直接到源文件夹include
INCLUDEPATH += $$top_srcdir/creator
SOURCES += \
main.cpp
默认工程
可能在默认的一个库工程中会给出默认的如下代码:
这是qt Creator 默认形式,应该也可行,但没怎么使用过这种形式。
TEMPLATE = lib
DEFINES += UNTITLED2_LIBRARY
#ifndef UNTITLED_GLOBAL_H
#define UNTITLED_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(UNTITLED_LIBRARY)
# define UNTITLED_EXPORT Q_DECL_EXPORT
#else
# define UNTITLED_EXPORT Q_DECL_IMPORT
#endif
#endif // UNTITLED_GLOBAL_H
#ifndef UNTITLED_H
#define UNTITLED_H
#include "untitled_global.h"
class UNTITLED_EXPORT Untitled
{
public:
Untitled();
};
#endif // UNTITLED_H
链接方式
链接方式其实写法比较自由,上文中是直接将路径和文件合并的书写。
也可以分开来,比如像传统gcc一样的写:
LIBS += -L $$PWD/bin -l xxx