qt使用动态库(DLL)
连接库分为2种
////////////////////////////////// MFCDLL.h /////////////////////////////////////
#ifndef _MFCDLL_H
#define _MFCDLL_H #ifdef __cplusplus
extern "C" {
#endif #ifdef DLL
// do nothing
#else
#define DLL __declspec(dllimport)
#endif DLL void hello();
DLL int add(int a, int b); #ifdef __cplusplus
}
#endif #endif
////////////////////////////////// MFCDLL.cpp /////////////////////////////////////
#define DLL __declspec(dllexport)
#include "MFCDLL.h"
#include <windows.h> void hello()
{
::MessageBox(NULL, "hello world!",
"greeting", MB_OK);
} int add(int a, int b)
{
return a + b;
}
【使用QT生成DLL】使用QT建立动态库工程,编译即可得到DLL(无LIB文件)
////////////////////////////////// qtdll_global.h //////////////////////////////
#ifndef QTDLL_GLOBAL_H
#define QTDLL_GLOBAL_H #include #if defined(QTDLL_LIBRARY)
# define QTDLLSHARED_EXPORT Q_DECL_EXPORT
#else
# define QTDLLSHARED_EXPORT Q_DECL_IMPORT
#endif #endif // QTDLL_GLOBAL_H
////////////////////////////////// qtdll.h /////////////////////////////////////
#ifndef QTDLL_H
#define QTDLL_H #include "qtdll_global.h" class QTDLLSHARED_EXPORT QTDLL
{
public:
QTDLL(); public:
int add(int a, int b);
}; #endif // QTDLL_H
////////////////////////////////// qtdll.cpp ///////////////////////////////////
#include "qtdll.h" QTDLL::QTDLL()
{
} int QTDLL::add(int a, int b)
{
return a + b;
}
【QT显式加载VC生成的DLL】
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QLibrary>
#include <QDebug> MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); // DLL显式加载,只需要DLL文件即可,不需要.H和.LIB文件
// 需要将DLL放到可执行目录中
typedef void(*FUN1)();
typedef int(*FUN2)(int, int); QLibrary lib("MFCDLL.dll");
if (lib.load()) {
qDebug() << "load ok!"; FUN1 hello = (FUN1)lib.resolve("hello");
FUN2 add = (FUN2)lib.resolve("add");
if (hello) {
qDebug() << "load hello ok!";
hello();
}
if (add) {
qDebug() << "load add ok!";
qDebug() << add(, );
}
} else {
qDebug() << "load error!";
}
}
【QT隐式加载VC生成的DLL】
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "lib/MFCDLL.h"
#include <QDebug> MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); // DLL隐式加载,只需要.DLL .H和.LIB文件
// 1需要将DLL放到可执行目录中
// 2将LIB路径设置到项目PRO文件中
// 3将头文件包含进来,如果不包含需要自已声明函数原型及来源(本质与包含头文件相同)
hello();
qDebug() << add(, );
qDebug() << "ok";
}
pro工程文件中要设置LIB文件路径
# lib文件路径
LIBS += "F:/lib/MFC_DLL_TEST_WITH_QT_2/lib/MFCDLL.lib"
【QT使用QT生成的动态库,隐式】
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include "lib/qtdll.h" MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); // QT使用QT生成的DLL
// 1. 包含头文件
// 2. 在工程文件中指定lib路径
// 3. 将动态库拷贝到可执行文件目录
QTDLL dll;
qDebug() << dll.add(, );
}
pro工程文件中的设置
LIBS += "F:/lib/QT_DLL_TEST_WITH_DLL/lib/QTDLL.dll"
qt使用动态库(DLL)的更多相关文章
- Qt编写自定义控件插件开放动态库dll使用(永久免费)
这套控件陆陆续续完善了四年多,目前共133个控件,除了十几个控件参考网友开源的代码写的,其余全部原创,在发布之初就有打算将动态库开放出来永久免费使用,在控件比较完善的今天抽了半天时间编译了多个qt版本 ...
- Qt生成和调用动态库dll,和静态库.a(windows和linux通用)
系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...
- 五,动态库(dll)的封装与使用
在项目开发中,我们经常会使用到动态库(dll),要么是使用别人的动态库,要么是将功能函数封装为动态库给别人用.那么如何封装和使用动态库呢?以下内容为你讲解. 1.动态库的封装 以vs2010为例,我们 ...
- 在VS2015中用C++编写可被其它语言调用的动态库DLL
转自:http://blog.csdn.net/songyi160/article/details/50754705 VS2015用C++创建动态库DLL步骤如下: (1)启动VS2015>文件 ...
- C++与C#有关对库(动态库dll,静态库.lib)文件的调用
1 动态库的相互调用 1.1 C#调用C++ dll步骤(只能导出方法): 1. c++建立空项目->源文件文件夹中添加cpp文件和函数 2. c++属性设置中,配置类型设置为动态库dll,公共 ...
- Qt中添加静态库.lb,.a和动态库.dll,.so,头文件和.cpp文件
添加步骤 1.-Qt Creator中,"项目"------"添加库"2.把静态库和动态库文件放到项目文件夹中3.在.pro文件中会添加如下代码: - 添加动态 ...
- C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)
1. 首先,如何制作一个静态库(lib)? 额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件.之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去 ...
- 关于修改动态库DLL的问题
最近在做一个小软件,需要做到新建.修改动态链接库(DLL)的功能.新建很简单,但是在修改的时候我突然发现问题来了.首先软件会在启动的时候将所有协议加载出来,然后做展示.此时你可以添加或减少动态库中的属 ...
- 动态库DLL加载方式-静态加载和动态加载
静态加载: 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib ...
随机推荐
- A Shade of Moonlight CodeForces - 989D
看这位博主的吧:https://blog.csdn.net/Steaunk/article/details/80660954
- Mysql向数据库插入数据时,判断是否存在,若不存在就插入数据
表中一定要有主键 : select :id,此处的id位置处必须是主键 insert into table_name(id, name, password) select :id, :name, : ...
- Android Emoji兼容包使用详解
Emoji兼容性 我们经常会遇到这样的问题: 给朋友发的emoji表情, 在自己手机上展示是正常的, 但是到朋友手机上, 却没有展示出来, 或者展示出来了, 但是也跟自己手机上展示的不一样. 所以, ...
- 洛谷P1592 互质
题目描述 输入两个正整数n和k,求与n互质的第k个正整数. 输入输出格式 输入格式: 仅一行,为两个正整数n(≤10^6)和k(≤10^8). 输出格式: 一个正整数,表示与n互质的第k个正整数. 由 ...
- 《Linux内核设计与实现》第3章读书笔记
第三章 进程管理 一.进程 1.进程就是处于执行期的程序,但并不局限于可执行代码.实际上,进程是正在执行的程序代码的实时结果. 2.执行线程是在进程中活动的对象 每个线程拥有一个独立的计数器.进程栈. ...
- 单点登录(十二)-----遇到问题-----cas启用mongodb验证方式登录后没反应-pac4j-mongo包中的MongoAuthenticatInvocationTargetException
cas启用mongodb验证方式登录后没反应 控制台输出 2017-02-09 20:27:15,766 INFO [org.jasig.cas.authentication.MongoAuthent ...
- python抓取
我要抓取奥巴马每周的演讲内容http://www.putclub.com/html/radio/VOA/presidentspeech/index.html 如果手动提取,就需要一个个点进去,再复制保 ...
- hdu 3068
最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 面向对象SOLID原则的自我理解
S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则(Programming Priciple)的首字母缩写.面向对象设计的原则SRP The Single Res ...
- Java 从业一年的心得体会
在你打开此文时,你或许在犹豫这个职业,但是我觉得干就好了,没有适合不适合,趁年轻折腾吧! 以下是我一年来从事Java的经验积累,知识有很多,经验就九条 1.设计的数据库表尽量添加一个状态位,可以在删除 ...