Qt 动态库/静态库的创建和使用教程(step by step) :带笔记(**)

目录

Qt 动态库的生成和调用 (*****OK)

Qt 动态库和静态库的创建与使用 (***)

Qt 动态库/静态库的创建和使用教程(step by step)

-----------------------------------------------

动态库显式调用

显示调用不需要修改.pro文件,也不需要加头文件,主要是通过 QLibrary 方法

注:即使最后不想用这个,但是,在查错时,还是可以用的?

1、头文件#include
2、QLibrary mylib(“/xxx/xxx/testldd.so”);     即里面参数为库地址
3、然后  if(mylib.load())  通过 load()函数去加载动态库 (加载后,库将保留在内存中,直到应用程序终止。我们可以尝试使用 unload( ) 来卸载库)

4、 声明函数指针,通过resolve得到库中函数地址
typedef void (*Fun)();
Fun method = (Fun)mylib.resolve(“method-name”);
if(!method) //判断是否获取成功
5、最后再调用即可

在Pro文件中配置文件如下:

INCLUDEPATH += $$PWD/include

LIBS += -L$$PWD/lib -lMyDll

($$PWD的意思是pro文件所在的目录)

搜索路径:会包含当前路径,将库放在当前路径下测试,可以省去路径错误的麻烦。

测试 OK后,再调整库的文件夹。

-----------------------------------------------

参考:
Qt 制作和使用自己制作的 静态库
https://blog.csdn.net/ken2232/article/details/130447146

Qt 中添加 动态库(.so) 和 静态库 (.a) 的方法 (*)
https://blog.csdn.net/ken2232/article/details/130447069

Qt 动态库/静态库的创建和使用教程(step by step) :带笔记(**)
https://blog.csdn.net/ken2232/article/details/130446757

参考 2:

基于Qt的动态库*.dll文件创建

https://www.cnblogs.com/zhezhe1988/p/3737837.html

要点:

1. 获取制作的库函数文件

1.1. 在 App的源文件夹中:新建两个文件夹,一个叫lib,一个叫include,

将mydll.h、mydll_global.h拷贝到 include 文件夹,将MyDLL.dll拷贝到 lib的文件夹。

1.2. 在Pro文件中配置文件如下。。。。

注:不应该在 xxx_64_bit-Debug这类的输出文件夹中。因为它们可以,或者需要随时被删除。

2. 引入头文件

2.1. ​​​​​​​widget.h中引入动态库的头文件#include“MyDLL.h”,

2.2. 并定义一个动态库类对象Mydll dll

注:非静态的类成员,或方法,在使用之前,首先需要实例化。

===============================

Qt 动态库的生成和调用 (*****OK)

1.动态库的生成

1.1 文件->新建文件或项目->Library->C++ Library

1.2根据步骤选择到如下界面,Type选择 Shared Library

 1.3编译套件的选择,选择qt自带的

1.4 生成的文件如下:

 
1.5 .pro文件讲解:

 

1.6编写动态库测试文件

 

1.7 动态库生成的文件和位置

 

        Ctrl+B构建完在下面路径生成libMyDLL.a、MyDLL.dll和mydll.o三个文件,我们需要的是MyDLL.dll。

2.动态库的调用

2.1在qtcreater中按如下步骤创建使用动态库的工程

文件->新建文件或项目->Appliction->Qt widgets Application

​​​​​​​2.2工程取名为UseMydll,一直下一步就行。

2.3保存动态库和头文件

新建两个文件夹,一个叫lib,一个叫include,

将mydll.h、mydll_global.h拷贝到 include 文件夹,将MyDLL.dll拷贝到 lib的文件夹。

在Pro文件中配置文件如下:

INCLUDEPATH += $$PWD/include

LIBS += -L$$PWD/lib -lMyDll

($$PWD的意思是pro文件所在的目录)

2.4引入头文件

​​​​​​​widget.h中引入动态库的头文件#include“MyDLL.h”,并定义一个动态库类对象Mydll dll,代码如下

    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);


        MyDLL dll;


        int addResult = dll.add(1,2);
        qDebug()<<addResult;
    }

​​​​​​2.5运行结果入下:


————————————————
版权声明:本文为CSDN博主「信念的执行者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44820566/article/details/126089436

Qt 动态库和静态库的创建与使用 (***)

前言

c/c++开发中都会用到动态库和静态库。首先动态库和静态库的区别是什么呢?

静态库简介:

简单来讲,静态库,如果某个程序需要调用了一个静态库中的方法,在该程序编译时候会将该静态库一起编译进去,即会直接整合到目标程序中,编译成功的可执行文件可独立运行。静态库的扩展名一般为“.a”“.lib”,windows 则是.dll

动态库简介:

而动态库,某个程序在编译的时候,在程序里只有一个“指向”的位置而已,也就是说当可执行文件需要使用到函数库的机制时,程序才会去读取函数库来使用,也就是说可执行文件无法单独运行。

静态库与动态库优缺点大概如下

1、静态库

优点:
①静态库被打包到应用程序中加载速度快
②发布程序无需提供静态库,移植方便

缺点:
①相同的库文件数据可能在内存中被加载多份,消耗系统资源,浪费内存
②库文件更新需要重新编译项目文件,生成新的可执行程序,浪费时间。

2、动态库

优点:
①可实现不同进程间的资源共享
②动态库升级简单,只需要替换库文件,无需重新编译应用程序
③可以控制何时加载动态库,不调用库函数动态库不会被加载

缺点:
①加载速度比静态库慢
②发布程序需要提供依赖的动态库

动态库
动态库的创建

1、新建项目,选择Library->c++Library,选择Shared Library 即共享库(动态库), Qt module那里跟实际需要选择模块;
在这里插入图片描述
在这里插入图片描述


2、新建完成后会生成如下几个文件,testdll_global.h文件中是宏定义,可将此文件宏定义内容复制到testdll.h文件中,就不需要testdll_global.h文件了

 #ifndef TESTDLL_GLOBAL_H
#define TESTDLL_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(TESTDLL_LIBRARY)
#  define TESTDLL_EXPORT Q_DECL_EXPORT
#else
#  define TESTDLL_EXPORT Q_DECL_IMPORT
#endif

#endif // TESTDLL_GLOBAL_H

如果在QtCreator工具上编译的话,如果编译运行会提示如下窗口,因为是生成动态库,不能直接运行,但在build构建目录下已经生成libtestdll.so.1.0.0及它的连接文件,这就算创建成功了

上面这个界面,真是让人感到困惑

1. 难道是 库编译还没有成功?或者还没有完成?

NO。 已经编译 OK了。但是,需要启动外部可执行程序,才能执行动态库中的函数等等。

2. 假如没有上面这个界面,则需要弹出提示,表明:动态库编译完成了。

动态库自己是无法执行的,因此,编译完成之后,需要给出提示信息。

只是这个提示,太多花样了,容易被搞晕了头??


windows下是会生成这些

动态库使用

 动态库使用有隐式调用和显式调用。

动态库隐式调用

1、新建一个项目后,点击右键选择添加库->外部库->选择库的路径,点击先一步,然后完成。

2、在.pro文件中会生成库链接地址配置

3、此时在需要调用的地方,加上头文件"testdll.h",就可以使用库中的方法了。

动态库显式调用

显示调用不需要修改.pro文件,也不需要加头文件,主要是通过 QLibrary 方法

1、头文件#include
2、QLibrary mylib(“/xxx/xxx/testldd.so”); 即里面参数为库地址
3、然后 if(mylib.load()) 通过load()函数去加载动态库 (加载后,库将保留在内存中,直到应用程序终止。我们可以尝试使用 unload( ) 来卸载库)

4、 声明函数指针,通过resolve得到库中函数地址
typedef void (*Fun)();
Fun method = (Fun)mylib.resolve(“method-name”);
if(!method) //判断是否获取成功
5、最后再调用即可

动态库制作示例代码

按照上面新建动态库项目就可以得到.pro文件
testso.pro文件

QT -= gui

TEMPLATE = lib
DEFINES += TESTSO_LIBRARY

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    testso.cpp

HEADERS += \
    testso.h

# Default rules for deployment.
unix {
    target.path = /usr/lib
}
win32:{
    //动态库生成路径配置
        CONFIG(release, debug|release):{
            DESTDIR = $$PWD/../lib/win/x86/release
        }
        else:CONFIG(debug, debug|release):{
            DESTDIR = $$PWD/../lib/win/x86/debug
        }
}
!isEmpty(target.path): INSTALLS += target

testso.h文件

#ifndef TESTSO_H
#define TESTSO_H

#include <QtCore/qglobal.h>
#include <QString>
#if defined(TESTSO_LIBRARY)
#  define TESTSO_EXPORT Q_DECL_EXPORT
#else
#  define TESTSO_EXPORT Q_DECL_IMPORT
#endif

extern "C" Q_DECL_EXPORT QString getString();

#endif // TESTSO_H

testso.cpp文件

#include "testso.h"

QString getString()
{
    return QString("hello I`m dll!");
}

在终端 执行 qmake -> make 可在当前目录下生成.so库文件,windows则是.dll

动态库隐式使用示例代码

新建Application项目后,右键添加库路径后,会在pro文件中加入
test.pro文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

//下面这三行就是 右键添加库地址后生成的
unix:!macx: LIBS += -L$$PWD/../testso/ -ltestso
INCLUDEPATH += $$PWD/../testso
DEPENDPATH += $$PWD/../testso

maindialog.h就是生成默认的未修改,选择Qwidget也可以的

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

maindialog.cpp 这里就是使用的地方,加上头文件,调用里面的getString

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testso.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
   qDebug()<<getString();
}

MainWindow::~MainWindow()
{
    delete ui;
}

动态库显式使用示例代码

新建Application项目后,不用添加库和头文件,只需调用QLibrary相关方法即可
这里只有mainwindow.cpp不同,
mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLibrary>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    QLibrary lib2("/testso/libtestso.so");//windows下则是加入xxx.dll即可
    if(!lib2.load()){
        qDebug()<<"error";
    }

    if(lib2.isLoaded()){
        qDebug()<<"load sucess!";
    }

    typedef QString (*lpgetString)();

    lpgetString getString = (lpgetString)lib2.resolve("getString");

    if(!getString){
        qDebug()<<"getString null!";
        return;
    }

    qDebug()<<getString();


    lib2.unload();
}

MainWindow::~MainWindow()
{
    delete ui;
}

静态库制作

静态制作与动态库差不同,只是在新建lib库时选择 statically :Linked Library 静态库。在编译后,会生成.a的文件

静态库使用

静态库使用,首先也是在项目中右键添加库路径,不同的是需要把静态库的头文件即.h文件复制并导入到使用程序项目中再使用。

————————————————
版权声明:本文为CSDN博主「kchmmd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kchmmd/article/details/122983897

Qt 动态库/静态库的创建和使用教程(step by step)

一般大型项目中, 会将实现特定功能的函数或类, 封装成链接库, 供应用程序代码调用. 下面我将一步步教你如何在qt 中创建动态库/静态库, 并使用它.

目录

    创建多子目录项目
    创建动态链接库
    编辑链接库内容
    创建应用工程并连接动态链接库

创建多子目录项目

首先创建一个多子目录项目(即含有多个项目的工程, 类似于VS中的解决方案)

输入项目名称, 选择创建路径. 比如"demo".

选择编译工具, 这里MSVC, MinGW 均可.

完成&添加子项目.

创建动态链接库

选择 “Library” | “C++ Library”.

输入库的名称.

选择 “qmake”.

类型设置为共享库, "Qt module"根据库的功能设置为Core, Widget, 或其他.

编译工具选择, 所有的子项目均选择相同的编译工具.

完成即可.

编辑链接库内容

打开 “mydll.pro”, 添加内容: DESTDIR = ../(指定目标文件的输出位置)

"mydll.h"的类声明中添加函数声明.

在"mydll.cpp"中 添加 函数的定义.

注意:一般不要直接使用构造函数 来作为库函数

创建应用工程并连接动态链接库

    在顶层项目"demo"上右键选择 添加新子项目.
    在这里插入图片描述
    选择: “Application(Qt)” -> “Qt Widgets Application”
    在这里插入图片描述- 输入子项目名称, 比如:“app”
    在这里插入图片描述
    选择构建系统为:“qmake”
    在这里插入图片描述
    在这里插入图片描述选择编译工具, 所有的子项目均选择相同的编译工具.
    在这里插入图片描述- 完成.
    在这里插入图片描述

- 打开"app.pro", 添加内容:

LIBS += ../mydll.lib

DESTDIR = ../

    LIBS 指定要链接的库名称, 因为在"mydll.pro"中指定了目标文件路径为"…/“, 所以, 库名称为”…/mydll.lib"

    编辑"mainwindow.cpp", 添加如下内容, 调用动态链接库中的函数.

   

构建项目.

在这里插入图片描述

    如果能够构建成功, 动态库的创建和使用应该是没问题的.
    接下来, 运行我们的工程. 在应用程序输出窗口, 可以看到打印信息.

注意: 修改 DESTDIR 很重要, 将所有链接库的和应用程序输出的目标文件都指定到"…/", 这样运行应用程序时就不会出现找不到动态链接库的情况.


————————————————
版权声明:本文为CSDN博主「falwat」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/falwat/article/details/130330830

=============================================

笔记1:

在.pro文件中添加

LIBS += -L$$PWD/lib/ -lCreateDLL

建议Qt调用.a的库,.lib文件的库使用vs编写程序调用。

注意:

-L 参数指定 .lib/.a 文件的位置

-l 参数指定导入库文件名(不要加扩展名)  //加上,好像也没有问题?

PWD 指的是当前目录

另外,导入库文件的路径中,反斜杠用的是向右倾斜的,中间是有空格的。

Qt Creator调用动态链接库文件_qtcreate libs += -lqhttpserver_樊同学爱编程的博客-CSDN博客

笔记2:

1、先说明本文要实现的功能:

(1)生成一个动态链接库;

(2)隐式加载动态链接库,需要的文件:*.h(非必须文件,如果不使用*.h文件,那么调用程序所需要的函数或是类就需要自己声明,所以说建议直接使用动态链接库的*.h文件如果使用别人的动态链接库没有*.h文件那只有自己在调用程序中声明);*.dll文件(必须有);*.lib文件(必须有)。

(3)使用QLibrary()动态加载,*.h 同2;*.dll(必须有);*.lib(不使用)。
————————————————
版权声明:本文为CSDN博主「小米的修行之路」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012372584/article/details/104345346

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值