目录
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.youkuaiyun.com/ken2232/article/details/130447146
Qt 中添加 动态库(.so) 和 静态库 (.a) 的方法 (*)
https://blog.youkuaiyun.com/ken2232/article/details/130447069
Qt 动态库/静态库的创建和使用教程(step by step) :带笔记(**)
https://blog.youkuaiyun.com/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运行结果入下:
————————————————
版权声明:本文为优快云博主「信念的执行者」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/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_LIBRARYCONFIG += 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.0SOURCES += \
testso.cppHEADERS += \
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
#endifextern "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.0SOURCES += \
main.cpp \
mainwindow.cppHEADERS += \
mainwindow.hFORMS += \
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/../testsomaindialog.h就是生成默认的未修改,选择Qwidget也可以的
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{
Q_OBJECTpublic:
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文件复制并导入到使用程序项目中再使用。
————————————————
版权声明:本文为优快云博主「kchmmd」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/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 很重要, 将所有链接库的和应用程序输出的目标文件都指定到"…/", 这样运行应用程序时就不会出现找不到动态链接库的情况.
————————————————
版权声明:本文为优快云博主「falwat」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/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_樊同学爱编程的博客-优快云博客
笔记2:
1、先说明本文要实现的功能:
(1)生成一个动态链接库;
(2)隐式加载动态链接库,需要的文件:*.h(非必须文件,如果不使用*.h文件,那么调用程序所需要的函数或是类就需要自己声明,所以说建议直接使用动态链接库的*.h文件。如果使用别人的动态链接库没有*.h文件那只有自己在调用程序中声明了);*.dll文件(必须有);*.lib文件(必须有)。
(3)使用QLibrary()动态加载,*.h 同2;*.dll(必须有);*.lib(不使用)。
————————————————
版权声明:本文为优快云博主「小米的修行之路」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/u012372584/article/details/104345346