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 ...
随机推荐
- MT【122】一个重要的不平凡的无穷级数
求证:$1+\dfrac{1}{4}+\dfrac{1}{9}+\cdots +\dfrac{1}{n^2}+\cdots = \dfrac{\pi^2}6$. 解答:考虑$$\dfrac{\sin ...
- 【刷题】HDU 1853 Cyclic Tour
Problem Description There are N cities in our country, and M one-way roads connecting them. Now Litt ...
- Java的顺序栈和链式栈
栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...
- ActiveMQ反序列化漏洞(CVE-2015-5254)复现
0x00 漏洞前言 Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务,集群,Spring Framework等.Apache ...
- Android ListView 几个重要属性
Android ListView 几个重要属性http://blog.csdn.net/avenleft/article/details/7334060 android:transcriptMode= ...
- 【整体二分】【P3834】 【模板】可持久化线段树 1(主席树)
Description 给定一个长度为 \(n\) 的序列, \(m\) 次操作静态查询区间第 \(k\) 大 Input 第一行是 \(n,m\) 下一行描述这个序列 下面 \(m\) 行描述操作 ...
- ribbion的负载均衡之端口的切换
可以说在这里被坑了很久,终于今天在大神的指导下,成功实现了负载均衡,切换不同的端口,这里来记录下,首先来看下效果图吧: 到底是怎么实现的呢?到底是如何切换的呢? 具体来讲: 几个步骤,启动服务注册中心 ...
- matlab绿色版本合集
网上找的matlab绿色版本合集链接https://pan.baidu.com/s/1gfDyIo7 密码:pxrs
- Sentence-seven basic patterns 英语句子结构
Meaning of some words subject 主语 verb 动词 object 宾语 adverbial 状语 complement 补语 imperative sentence 祈 ...
- Java基础-线程操作共享数据的安全问题
Java基础-线程操作共享数据的安全问题 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.引发线程安全问题 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运 ...