本文主要讲解在QT开发环境中如何使用VC生成的DLL及QT自身生成的DLL。至于其它情况本文不作讨论。

连接库分为2种

(1)动态连接库,通常有.h .lib .dll三个文件,功能实现在dll中
(2)静态连接库,通常有.h .lib二个文件,功能实现在lib中
由上可以看出动态库的lib和静态库的lib文件是不同的。
    如果使用生成连接库的开发环境与使用连接库的开发环境相同,一般不会出什么问题,如VC写的连接库
(包括动态库和静态库)还在VC中用一般不会有什么问题的。有时候我们需要DLL跨开发环境,如以前VC下的
DLL想在QT中用。有网友说QT不支持VC生成的静态库,所以只测试QT使用动态库的情况。
【先看VC生成的DLL】
使用VC6建立Win32 dynamic-link library工程,工程中只有两个文件,编译即可生成DLL和LIB
 
////////////////////////////////// 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)的更多相关文章

  1. Qt编写自定义控件插件开放动态库dll使用(永久免费)

    这套控件陆陆续续完善了四年多,目前共133个控件,除了十几个控件参考网友开源的代码写的,其余全部原创,在发布之初就有打算将动态库开放出来永久免费使用,在控件比较完善的今天抽了半天时间编译了多个qt版本 ...

  2. Qt生成和调用动态库dll,和静态库.a(windows和linux通用)

    系统1:ThinkPad T570.Windows10.QT5.12.2(Qt Creater 4.8.2)一.动态库.dll的创建和调用1.在qtcreater中按如下步骤创建动态库,动态库名为my ...

  3. 五,动态库(dll)的封装与使用

    在项目开发中,我们经常会使用到动态库(dll),要么是使用别人的动态库,要么是将功能函数封装为动态库给别人用.那么如何封装和使用动态库呢?以下内容为你讲解. 1.动态库的封装 以vs2010为例,我们 ...

  4. 在VS2015中用C++编写可被其它语言调用的动态库DLL

    转自:http://blog.csdn.net/songyi160/article/details/50754705 VS2015用C++创建动态库DLL步骤如下: (1)启动VS2015>文件 ...

  5. C++与C#有关对库(动态库dll,静态库.lib)文件的调用

    1 动态库的相互调用 1.1 C#调用C++ dll步骤(只能导出方法): 1. c++建立空项目->源文件文件夹中添加cpp文件和函数 2. c++属性设置中,配置类型设置为动态库dll,公共 ...

  6. Qt中添加静态库.lb,.a和动态库.dll,.so,头文件和.cpp文件

    添加步骤 1.-Qt Creator中,"项目"------"添加库"2.把静态库和动态库文件放到项目文件夹中3.在.pro文件中会添加如下代码: - 添加动态 ...

  7. C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)

    1. 首先,如何制作一个静态库(lib)? 额, 对于静态库,我们知道,里头是不应该有Main函数,它只是一个配合文件.之所以称之为lib静态库,其实就是指,我们需要用到lib里头的函数时,我们才会去 ...

  8. 关于修改动态库DLL的问题

    最近在做一个小软件,需要做到新建.修改动态链接库(DLL)的功能.新建很简单,但是在修改的时候我突然发现问题来了.首先软件会在启动的时候将所有协议加载出来,然后做展示.此时你可以添加或减少动态库中的属 ...

  9. 动态库DLL加载方式-静态加载和动态加载

    静态加载: 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib ...

随机推荐

  1. BZOJ3142 [Hnoi2013]数列 【组合数学】

    题目链接 BZOJ3142 题解 题意:选一个正整数和\(K - 1\)个\([1,M]\)中的数,使得总和小于等于\(N\),求方案数模\(P\) 题目中\(K(M - 1) < N\)的限制 ...

  2. Java类编译、加载、和执行机制

    Java类编译.加载.和执行机制 标签: java 类加载 类编译 类执行 机制 0.前言 个人认为,对于JVM的理解,主要是两大方面内容: Java类的编译.加载和执行. JVM的内存管理和垃圾回收 ...

  3. 解题:WC 2007 石头剪刀布

    题面 要我们把边定向,最大化留下来的三元环数目......并不能直接做,考虑容斥,去掉不合法的数目. 那么三个点不成环当且仅当有一个点出度为2一个点入度为2,发现最终答案就是$C_n^3-\sum C ...

  4. 如何修改Windows程序的权限?

    修改程序的权限需要用到3个函数: 1. 获取进程的令牌句柄: OpenProcessToken 2. 查找特权类型的ID: LookupPrivilegeValue 3. 修改进程的特权:Adjust ...

  5. Python pytagcloud 中文分词 生成标签云 系列(一)

    转载地址:https://zhuanlan.zhihu.com/p/20432734工具 Python 2.7 (前几天试了试 Scrapy 所以用的 py2 .血泪的教训告诉我们能用 py3 千万别 ...

  6. web页面的绝对路径

    在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:一.使用${pageContext.request ...

  7. (四)关于读文件的结束的判别方法(EOF和feof)以及区别

    关于读文件的时候判断文本是否读完的方式一般可以通过EOF,一般宏定义为-1.因为ASCII码中不可能出现-1. 当以文本形式读取文件内容, 读入的字符值等于EOF时, 表示读入的已不是正常的字符而是文 ...

  8. Leetcode 503. 下一个更大元素 II

    1.题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应 ...

  9. Java基础-位运算符Bitwise Operators

    Java基础-位运算符Bitwise Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.位运算特点 位运算符分为按位与(&),按位或(|),按位异或(^ ...

  10. POJ No 3259 Wormholes Bellman-Ford 判断是否存在负图

    题目:http://poj.org/problem?id=3259 题意:主要就是构造图, 然后判断,是否存在负图,可以回到原点 /* 2 3 3 1 //N, M, W 1 2 2 1 3 4 2 ...