背景:
主程序运行环境:64位QT5.7.1,使用addin 加进了VS2015里
dll的生成环境:VS2015
dll的编写语言:.cpp后缀但使用了很多C语言风格的函数,主要是malloc, calloc 等
需要注意的:64位的QT只能调用64位的dll,32位的QT只能调用32位的dll
准备工作:下载一个Dependency Walker可以帮助你检查dll里的函数名和调用关系。
Dependency Walker下载地址:http://www.dependencywalker.com/
Dependency Walker 的简单使用教程https://jingyan.baidu.com/article/a3761b2bdfe24b1577f9aa4e.html
1.生成dll
新建一个win32项目
新建一个dlltest.cpp文件和一个dlltest.h文件
cpp文件里写
#include "dlltest.h"
int add(int a, int b)
{
return a+b;
}
头文件里写
#pragma once
int add(int a, int b);
1)用模块定义文件生成dll
新建一个dlltest.def文件
dlltest文件里写(add是函数名)
LIBRARY "dlltest"
EXPORTS
add
点击生成解决方案,在 C:\Users\Administrator\Desktop\dlltest\Debug\dlltest.dll路径下生成dll
配置平台是×86,说明生成的dll是32位的,要生成64位的dll,需要更改配置平台为×64
再点击生成解决方案,此时生成的路径变为 C:\Users\Administrator\Desktop\dlltest\x64\Debug\dlltest.dll
配置平台为×64时,如果没有生成dll文件,选择项目->属性->配置属性->常规->配置类型->选择动态库.dll
2)__declspec(dllexport)方式
在函数的定义和声明前加上__declspec(dllexport)即可,不需要.def文件
有时候第一种方式无法导出函数时可以试试第二种方式
用dependency walker打开两种方式生成的dll,可以看到导出的add函数
2.QT调用DLL(这里我们使用显示方式调用dll)
新建64QT项目,把刚刚生成的64位的dll文件复制到QT项目×64/debug文件夹下,也就是exe所在文件夹
cpp文件添加#include
主函数里写
QLibrary lib("dlltest.dll");
if (lib.load())
{
typedef int(*ADD)(int, int);
ADD add= (ADD)lib.resolve("add");
int z = add(3, 5); }
这样就可以成功调用啦~