LINUX学习笔记:(3)静态库与动态链接库使用
宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64
日期: 2018-3-9 12:46:18
作者: SY
简介
使用库文件的目的是为了更好的复用代码。
静态库 :在连接阶段会和目标代码连接在一起,组成一个可执行程序。
后缀:.a
。类似于 Windows
平台下的 .lib
文件。
动态链接库 :在运行时被可执行程序调用,灵活度更高。
后缀:.so
。类似于 Windows
平台下的 .dll
文件。
调用方式
我们以 QT
平台为例。
静态链接库
文件名必须是:libxxx.a
形式,其中以 lib
开头,以 .a
作为后缀名,xxx
表示库名。
比如我们有一个库文件:/home/sy/Desktop/key/key/libgooglepinyin.a
打开工程中的 xxx.pro
文件,添加如下内容:
LIBS += -L/home/sy/Desktop/key/key -lgooglepinyin
-L
表示文件所在目录
-l
表示文件名
注意 :libgooglepinyin.a
只需要填写 googlepinyin
即可,多其他东西都会导致不能导入库。
动态链接库
文件名必须是:libxxx.so
形式,其中以 lib
开头,以 .so
作为后缀名,xxx
表示库名。
比如我们有一个库文件:/home/sy/Desktop/key/key/libQt5SoftKeyboard.so
打开工程中的 xxx.pro
文件,添加如下内容:
LIBS += -L/home/sy/Desktop/key/key -lQt5SoftKeyboard
动态链接库使用
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLibrary>
#include "platforminputcontextplugin.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QLibrary *m_li = NULL;
//加载动态库
//注意库要给路径否则加载不成功,libhello.so放在当前工程的目录下,所以路径为./
m_li = new QLibrary("./libQt5SoftKeyboard.so");
m_li->load();
if (!m_li->isLoaded())
{
return;
}
//定义函数指针
typedef QPlatformInputContext* (*Fun)(const QString& key, const QStringList ¶mList);
//resolve得到库中函数地址
Fun create = (Fun)m_li->resolve("create");
if (create)
{
PlatformInputContextPlugin *p = new PlatformInputContextPlugin();
QStringList paramList;
create("Qt5Input", paramList);
}
//卸载库
m_li->unload();
}
注意: 在加载动态链接库时,需要使用全名 new QLibrary("./libQt5SoftKeyboard.so");
。