Linux下Qt创建共享库与链接共享库详解
![作者头像](https://ask.qcloudimg.com/custom-avatar/5908113/qic06s6b3d.jpg)
随着程序写的逐渐变多,或多或少的我们都会使用别人写好的库;或者我们不想让别人看到我们的一些核心程序,可以将核心程序封装成库。本次和大家分享的是在Ubuntu下使用Qt生成共享库以及在Qt中链接共享库的方法。
共享库是在Linux下的称呼,在Windows下被称为动态库。这块大家需要了解的是程序在编译时使用的库和程序在运行时使用的库需要一致,不然程序可能会闪退。而且运行时库的路径如果没有设置,那么系统就会在默认的路径下进行搜索,如果没找到程序直接就挂了。之后的文章会进行总结说明的。
程序平台:Ubuntu14.04、 Qt5.5.1
一、Qt 创建共享库
1. 创建类型为库的Qt工程
① 新建工程-> Library -> C++ 库:
![](https://ask.qcloudimg.com/http-save/yehe-5908113/upmdbb0e66.png)
②类型选择默认的共享库,填写名称并选择工程路径。简单说下库的类型分别是动态库、静态库和Qt的插件
![](https://ask.qcloudimg.com/http-save/yehe-5908113/i9sn4z5u7j.png)
③选择默认的套件即可
④选择所需模块,这里我没有勾选任何模块
![](https://ask.qcloudimg.com/http-save/yehe-5908113/vojxzw1f6c.png)
⑤设置类的基本信息
⑥完成向导
2. 工程文件
①工程创建完成后,删掉了Qt生成的一些文件,文件目录如下
![](https://ask.qcloudimg.com/http-save/yehe-5908113/fc72rm43kc.png)
② .pro 文件的修改,添加版本号的设置等
QT -= core gui
TARGET = TestLib
TEMPLATE = lib
VERSION += 1.1.0
CONFIG += debug_and_release
CONFIG(debug, debug|release) {
unix: TARGET = $$join(TARGET,,,_debug)
else: TARGET = $$join(TARGET,,,d)
DEFINES += TESTLIB_LIBRARY
SOURCES += addlib.cpp
HEADERS += addlib.h
unix {
target.path = /usr/lib
INSTALLS += target
}
TARGET : 库的名称
TEMPLATE :模板类型,类型为lib ,即生成的是一个库文件
VERSION(新增部分) :库的版本号设置
CONFIG (新增部分) :控制编译的Debug与Release库的版本名称
1. 生成共享库
该共享库实现了计算两个整型数和的功能,过于简单,莫要介意~
① .h文件内容
#ifndef ADDLIB_H
#define ADDLIB_H
class AddLib
public:
AddLib();
int myAdd(int x, int y);
};
② .cpp内容
#include "addlib.h"
AddLib::AddLib()
int AddLib::myAdd(int x, int y)
return x + y;
}
③构建与运行
只构建的话就会直接生成共享库,如果运行的话就是下面这个样子。
![](https://ask.qcloudimg.com/http-save/yehe-5908113/hpsaup7d3j.png)
④生成动态库效果
到这里我们就已经生成好了动态库,可以看下我们添加的动态库的版本号。
注意,我这里没有区分Debug与Release版本。
![](https://ask.qcloudimg.com/http-save/yehe-5908113/huxdex8xd3.png)
二、链接动态库
1. 创建工程添加文件
创建一个继承QWidget的应用程序后,在与.pro文件同级目录下添加一个如下目录组织的文件:
main.cpp
***.pro
Lib/
test/
linux_x32/
Include/
addlib.h
lib/
libTestLib.so**
2. 借助Qt添加库
①右键项目->添加库
![](https://ask.qcloudimg.com/http-save/yehe-5908113/s70vr6uhyh.png)
②选择链接库的类型,选择【外部库】
![](https://ask.qcloudimg.com/http-save/yehe-5908113/k6l596yuna.png)
③选择链接库的路径与平台等信息
![](https://ask.qcloudimg.com/http-save/yehe-5908113/k6l596yuna.png)
④ .pro中新增文件
unix:!macx: LIBS += -L$$PWD/Lib/test/linux_x32/lib/ -lTestLib
INCLUDEPATH += $$PWD/Lib/test/linux_x32/include
DEPENDPATH += $$PWD/Lib/test/linux_x32/include
$$PWD :用于指定包含.pro文件目录的完整路径
INCLUDEPATH :指定了编译项目时被搜索到的 #include 目录
LIBS :指定了链接到项目中库的列表
⑤修改后的.pro文件
实际项目中我们的库可能会用到多个平台,所以一般创建如下
unix{
contains(QT_ARCH, i386){
INCLUDEPATH += $$PWD/Lib/test/linux_x32/include
LIBS += -L$$PWD/Lib/test/linux_x32/lib -lTestLib
contains(QT_ARCH, x86_64){
}else{
contains(QT_ARCH, i386){
contains(QT_ARCH, x86_64){
#64bit
}
3. 测试程序的编写
① .h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "addlib.h"
namespace Ui {
class Widget;
class Widget : public QWidget
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pbn_testAddLib_clicked();
private:
Ui::Widget *ui;
AddLib m_addLib;
#endif // WIDGET_H
②.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
ui->setupUi(this);
Widget::~Widget()
delete ui;
void Widget::on_pbn_testAddLib_clicked()
int x = ui->le_x->text().toInt();
int y = ui->le_y->text().toInt();
int ret = m_addLib.myAdd(x,y);