LINUX学习笔记:(3)静态库与动态链接库使用

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 
#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");

你可能感兴趣的:(LINUX,QT)