(QMake) 库的操作

文章目录

  • 预备
    • 目录结构
    • Code
  • *.pro
    • .qmake.conf
    • qtlib.pro
    • creator/creator.pro
    • user/user.pro
  • END

预备

目录结构

采用一个顶级工程qmake,管理两个子工程。

root:.
│  .qmake.conf
│  qtlib.pro
│
├─creator
│      creator.pro
│      mywidget.cpp
│      mywidget.h
│
└─user
        main.cpp
        user.pro

Code

测试代码非常简单。但关键是需要使用Qt库中的内容。

比如这里用了最具代表的QWidget。

user/main.cpp

#include 

#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 

class MyWidget : public QWidget {
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = nullptr);
};

#endif  // MYWIDGET_H

creator/creator.pro

#include "mywidget.h"

#include 
#include 

MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
    auto btn = new QPushButton{"diy-widget-lib", this};
    connect(btn, &QPushButton::clicked, this,
            []() { qDebug() << "btn clicked"; });
}

*.pro

.qmake.conf

  • top_srcdir 总工程资源目录
  • top_builddir总工程构建目录
# 配置全局的变量

top_srcdir=$$PWD
top_builddir=$$shadowed($$PWD)

qtlib.pro

TEMPLATE = subdirs

  • 注意,请加上CONFIG += ordered,并先添加库目录
    • 这样可以保证先编译出库,再在app应用中加载库
# 指定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)

creator/creator.pro

TEMPLATE = lib

  • 采用CONFIG选择动静态库
    • 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

user/user.pro

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

END

默认工程

可能在默认的一个库工程中会给出默认的如下代码:

这是qt Creator 默认形式,应该也可行,但没怎么使用过这种形式。

TEMPLATE = lib
DEFINES += UNTITLED2_LIBRARY
#ifndef UNTITLED_GLOBAL_H
#define UNTITLED_GLOBAL_H

#include 

#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

你可能感兴趣的:(Qt,C/C++,c++,qt)