64位QT调用 vs c++生成的dll

背景:

主程序运行环境: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项目

64位QT调用 vs c++生成的dll_第1张图片选择dll,空项目

64位QT调用 vs c++生成的dll_第2张图片

新建一个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文件

64位QT调用 vs c++生成的dll_第3张图片

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

64位QT调用 vs c++生成的dll_第4张图片

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); }

这样就可以成功调用啦~



你可能感兴趣的:(64位QT调用 vs c++生成的dll)