c语言自动导包,C++ 中动态链接库--导入和导出的实例详解

C++ 中动态链接库--导入和导出的实例详解

__declspec(dllexport)和__declspec(dllimport):

__declspec(dllexport):编译器看到一个变量、函数或者C++类被它修饰,那么它就知道应该在生成的DLL 模块中导出该变量、函数或C++类。

__declspec(dllimport):编译器看到一个变量、函数或者C++类被它修饰,那么它就知道可执行文件或DLL的源文件需要从其它DLL模块中导入一些变量和函数。

DLL的导入段:

构建可执行模块时,可执行模块还可以包含一个导入段,其中列出了所有它需要的DLL模块的名称,对列出的每个DLL,

该段还记录了可执行文件的二进制代码中引用的函数和变量的符号名。DLL中也有同样的导入段,

记录它所需要的模块名称和函数、符号名。

DLL文件导出段:

链接器生成DLL的文件中会嵌入一个导出符号表,这个导出段列出了导出的变量、函数和类的符号名。

extern "C"作用:

extern "C" 用来告诉编译器不要对变量名或函数名进行改编,这样C/C++或任何编程语言编写的可执行模块都可以访问该变量或函数。

创建兼容DLL:

C++支持函数重载,C语言不支持函数重载,C++编译器会对函数名进行修改,而C语言则不会。

为了用Microsoft工具包构建一个能与其它编译器厂商的工具包链接的DLL,必须告诉编译器不要对导出的函数名进行改编。

可通过以下几种方式实现:

1、extern "C" 修饰导出函数、变量和类;

2、为项目创建一个.def文件;

LIBRARY "dll-name.dll"

EXPORTS

func-name @ 1

.def文件的规则为:

1> EXPORTS语句后列出要导出函数的名称,可以在.def文件中的导出函数名后加 @n,表示要导出函数的序号为n;

2> .def文件中的注释由每个注释行开始处的分号指定,且注释不能与语句共享一行;

3、DLL源文件中加入:#pragma comment(linker, "/export:MyFunc=_MyFunc@8")

如有疑问请留言或者到本站社区 交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值