关于dll中函数的导出与导入

被同事问了一个使用dll导出函数导致编译不过的问题,写博客整理备忘。

 

假设我在做一个计算器,然后里头的数学运算希望放到一个dll中实现,方便复用。

计算器calc.exe

数学运算库:math.dll math.lib

我希望在math.dll中导出int add(int,int);函数给calc.exe使用

 

做法:

第一步:在math项目对应中添加两个文件

math.h

#ifdef MATH_LIB

#define MATHAPI extern "C" __declspec(dllexport)

#else

#define MATHAPI extern "C" __declspec(dllimport)

#endif

 

MATHAPI void add(int,int);

 

math.cpp

#include "math.h"

#define MATH_LIB

int add(int a, int b) { return a + b; }

 

第二步:在calc项目中添加main.cpp

#include "math.h"

#pragma comment(lib, "math.lib")

int main()

{

    int sum = add(1, 2);

    return 0;

}

 

 

说明:

1.math工程中我们定义了MATH_LIB宏,所以MATHAPI就被定义成了 extern "C" __declspec(dllexport)

也就是说函数使用这个修饰符就是说明是导出的函数,可以被外面使用。

2.calc工程中没有定义MATH_LIB宏,所以MATHAPI就被定义成了 extern "C" __declspec(dllimport)

也就是说add函数是别的dll中导出的,不是我自己实现的函数。

3.注意#pragma comment(lib, "math.lib")这个是让calc在链接阶段去math.lib中找函数符号。如果没有这句话会导致

链接的时候失败。如果有math.lib但是没有math.dll整个编译链接都不会有问题的,运行的时候才会提示math.dll找不多。

4.extern "C" 的使用是为了让C语言也能使用导出的函数,主要是为了避免编译器的名称改编行为。extern "C" 是在编写c++代码时需要用到的,编写c语言程序是不需要这个标记的。

 

总结:

无论是在微软代码里头还是谷歌代码里头,一般导出dll的函数都是这么使用的,也很简单。

不过里头还涉及很多关于dll的一些原理,这里暂时不写出来了,感兴趣的同学可以去看看《windows核心编程》。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VS(Visual Studio)是一种集成开发环境,其包含了许多工具和功能,用于帮助开发人员进行软件开发和调试。而查看DLL(动态链接库)的导出函数是一种技术,用于查看和分析DLL文件所包含的函数。 在VS,我们可以使用多种方法查看DLL导出函数。以下为其几种常用的方法: 1. 使用"查看导出函数"工具:在VS,我们可以使用内置的"查看导出函数"工具来查看DLL导出函数列表。通过打开该工具,然后选择要查看的DLL文件,即可显示出该DLL所有的导出函数及其所在的模块和内存地址等信息。 2. 使用导入库文件:在创建或者使用DLL的项目,可以通过使用相应的导入库文件来查看并调用DLL导出函数。通过在项目设置引用相应的导入库文件,我们可以在代码直接引用DLL函数,并通过VS的代码编辑器来查看函数的定义和实现等信息。 3. 使用反汇编工具:除了使用VS自带的工具外,我们还可以使用第三方的反汇编工具来查看DLL导出函数。这些工具可以将DLL文件进行反汇编,以获取其的代码和函数等信息。通过分析反汇编结果,我们可以得知DLL导出函数的名称、参数、返回值和内部实现等信息。 总而言之,VS提供了多种方法来查看DLL导出函数,如使用内置工具、导入库文件和第三方反汇编工具等。这些方法都能帮助我们在开发和调试过程了解DLL函数,从而更好地使用和调用它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值