Qt创建使用动态链接库工程(转)

目录

1、建立并生成动态链接库

2、测试生成的DLL

验证环境:ubuntu18.04+Qt5.14

验证内容:导出类,导出函数带参数/不带参数的函数。

1、建立并生成动态链接库
1、打开QtCreator,新建工程,我们选择Library,C++库,然后就是choose。

 

2、然后在弹出的C++库对话框我们默认类型共享库,名称为MyDll。然后,一直下一步,直到点击完成。

 

3、生成的代码结构

MyDll.pro

QT -= gui # 不需要界面

TARGET = MyDll #工程名
TEMPLATE = lib # 生成lib

DEFINES += MYDLL_LIBRARY # 预定义宏
DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += \
mydll.cpp

HEADERS += \
mydll.h \
mydll_global.h

unix {
target.path = /usr/lib
INSTALLS += target
}

mydll_global.h中,内容如下:

#ifndef MYDLL_GLOBAL_H
#define MYDLL_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MYDLL_LIBRARY)
# define MYDLLSHARED_EXPORT Q_DECL_EXPORT
#else
# define MYDLLSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // MYDLL_GLOBAL_H
可以看到系统自动定义了两个宏。用于声明哪些函数是需要我们导出的。

4、导出类,导出函数

首先我们在mydll.h中添加几行代码,如下图。注意:extern "C" MYDLLSHARED_EXPORT必须要有。

#ifndef MYDLL_H
#define MYDLL_H
#include mydll_global.h

class MYDLLSHARED_EXPORT MyDll
{
public:
MyDll();
virtual int sub(int a, int b);
};

extern C MYDLLSHARED_EXPORT void sayHello(); # 导出无参函数
extern C MYDLLSHARED_EXPORT int add(int a, int b); # 导出带参函数

extern C MYDLLSHARED_EXPORT MyDll *getMyDll(); # 导出类接口
#endif // MYDLL_H

mydll.cpp中的实现代码如下:

#include mydll.h
#include <iostream>

MyDll::MyDll()
{
}

int MyDll::sub(int a, int b)
{
return a-b;
}

void sayHello()
{
std::cout<<hello!<<std::endl;
}

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

MyDll * getMyDll()
{
return new MyDll();
}

代码编写完毕后,我们直接构建就行了。然后就可以看到我们生成的动态库了。

 

2、测试生成的DLL
1、新建一个基于Qt的控制台应用程序,名称为DllTest,与MyDll放在同一级目录下。

 

2、建好了以后,就可以进行调用验证了。

调用编译好的动态库需要引用两个东西:动态库的头文件和动态库文件。

1)在.pro中添加对Lib的引用

LIBS += ../build-MyDll-unknown-Release/mydll.o
2)在引用文件中,添加头文件的引用

#include ../MyDll/mydll.h
main.cpp调用完整代码:

#include <QCoreApplication>
#include <QLibrary>
#include <iostream>
#include ../MyDll/mydll.h

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

sayHello();
int c = add(1, 2);
std::cout<<add(1,2) = << c << std::endl;
MyDll *mydll = getMyDll();
int d = mydll->sub(2,1);
std::cout<<mydll->sub(2,1) = << d << std::endl;

return a.exec();
}

输出结果:


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

posted on   xihong  阅读(754)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示