Qt 共享库(动态链接库)和静态链接库的创建及调用

本文详细介绍了如何使用Qt Creator在Windows环境下创建和调用动态链接库(DLL)及静态链接库。通过两种方式调用共享库,对比了它们的优缺点,并展示了创建和调用静态库的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转:https://www.cnblogs.com/woxinfeixiang2015/p/8334112.html

前言: 编译器 Qt Creator, 系统环境 win7 64 位

1.创建共享库:

新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sharedlib)

生成的目录结构如图:

修改 sharedlib.h 中的代码:
复制代码

// sharedlib.h
#ifndef SHAREDLIB_H
#define SHAREDLIB_H

#include “sharedlib_global.h”

class SHAREDLIBSHARED_EXPORT Sharedlib// 导出类, 客户端可直接加载
{

public:
Sharedlib();
void test();
};

extern “C” Q_DECL_EXPORT int add(int a, int b);//导出函数, 客户端可用 QLibrary 加载

#endif // SHAREDLIB_H

复制代码

修改 sharedlib.cpp 中的代码:
复制代码

// sharedlib.cpp
#include “sharedlib.h”

#include

Sharedlib::Sharedlib()
{
}

void Sharedlib::test()
{
QMessageBox::warning(0, “Sharedlib::test”, “Sharedlib::test”);
}

int add(int a, int b)
{
return a+b;
}

复制代码

2.调用共享库(方式一):

新建文件或项目->选择 Application, Qt Console Application->项目名为 app1->下一步

修改客户端程序 main.cpp 中的代码:
复制代码

// main.cpp
#include
#include
#include
using namespace std;

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

typedef int (*Add)(int a, int b);

QLibrary mylib("sharedlib.dll");

if(!mylib.load()){// 加载 dll 失败
    cout<<"加载 sharedlib.dll 失败!"<<endl;
    return -1;
}
Add add = (Add)mylib.resolve("add");
if(0 == add){// 加载失败
    cout<<"加载函数 add 失败!"<<endl;
    return -1;
}

int sum = add(1,2);// 调用 add 函数

cout<<sum<<endl;

return 0;

return a.exec();

}

复制代码

编译 sharedlib 工程和 app1 工程-> 将生成的 sharedlib.dll 文件复制到 app1.exe 所在目录中->运行 app1.exe 输出 3

总结:这种调用方式需要在客户端程序编译时需要提供 .dll 的名字信息及其函数信息, 需要在客户端程序运行时提供 .dll 文件, 客户端中要写的代码较多.

3.调用共享库(方式二):

新建文件或项目->选择 Application, Qt QWidgets Application->项目名为 app2->下一步

app2.pro 文件最后添加如下代码, 用来说明 sharedlib.lib 的路径信息:

unix|win32: LIBS += -L$$PWD/…/build-sharedlib-unknown-Debug/debug/ -lsharedlib

INCLUDEPATH += P W D / . . / b u i l d − s h a r e d l i b − u n k n o w n − D e b u g / d e b u g D E P E N D P A T H + = PWD/../build-sharedlib-unknown-Debug/debug DEPENDPATH += PWD/../buildsharedlibunknownDebug/debugDEPENDPATH+=PWD/…/build-sharedlib-unknown-Debug/debug

将 sharedlib 工程源码目录下的 sharedlib.h 和 sharedlib_global.h 头文件复制到 app2 工程源码目录下, 将 sharedlib.dll 文件复制到 app2.exe 所在目录中

修改客户端程序 main.cpp 中的代码:
复制代码

// main.cpp
#include “mainwindow.h”
#include
#include “sharedlib.h”

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// MainWindow w;
// w.show();
Sharedlib sb;
sb.test();

return a.exec();

}

复制代码

编译 app2 工程, 运行 app2.exe, 弹出如图对话框, 表示程序正确执行:

总结: 这种调用方式需要在客户端程序编译时提供 .lib 和 .h 文件, 需要在客户端程序运行时提供 .dll 文件, 客户端中要写的代码较少.

4.方式一和方式二调用共享库的异同点:

客户端程序运行时都是只需要 .dll 文件; 编译时有些差别, 方式一代码较多, 但无需 .lib 和 .h 文件, 方式二代码简单(和调用普通类一样), 但是需要 .lib 和 .h 文件.

创建好三个项目后的文件结构如图:

  1. 静态链接库的创建:

新建文件或项目->选择 Library 和 c++ 库->选择静态链接库->下一步(工程名为 staticdlib)

修改 staticlib.h 中的代码:
复制代码

// staticlib.h
#ifndef STATICLIB_H
#define STATICLIB_H

class Staticlib
{

public:
Staticlib();
void test();
};

#endif // STATICLIB_H

复制代码

修改 staticlib.cpp 中的代码:
复制代码

// staticlib.cpp
#include “staticlib.h”
#include
using namespace std;

Staticlib::Staticlib()
{
cout<<“Staticlib::Staticlib”<<endl;
}

void Staticlib::test()
{
cout<<“Staticlib::test”<<endl;
}

复制代码

编译工程之后会生成 staticlib.lib 文件

  1. 调用静态链接库:

新建文件或项目->选择 Application, Qt Console Application->项目名为 app->下一步

app.pro 文件最后添加如下代码, 用来说明 staticlib.lib 的路径信息:

unix|win32: LIBS += -L$$PWD/…/build-staticlib-unknown-Debug/debug/ -lstaticlib

INCLUDEPATH += P W D / . . / b u i l d − s t a t i c l i b − u n k n o w n − D e b u g / d e b u g D E P E N D P A T H + = PWD/../build-staticlib-unknown-Debug/debug DEPENDPATH += PWD/../buildstaticlibunknownDebug/debugDEPENDPATH+=PWD/…/build-staticlib-unknown-Debug/debug

将 staticlib 工程目录下的 staticlib.h 复制到 app 工程目录下

修改客户端程序 main.cpp 中的代码:
复制代码

// main.cpp
#include
#include “staticlib.h”

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

Staticlib sb;
sb.test();

return a.exec();

}

复制代码

编译 app 工程, 生成 app.exe 文件, 运行 app.exe 文件, 输出如图:

总结: 客户端程序编译时需要 .h 和 .lib 文件, 运行时无需其它文件.

  1. 共享库(动态链接库)和静态链接库的异同点:

异: 调用共享库的客户端运行时需要 .dll 文件, 静态链接库的不需要;

  库程序发生改变时, 共享库客户端只需更新 .dll 文件, 静态链接库客户端需要重新编译.

同: 都可用于多模块共同开发程序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值