C++ 中动态链接库--导入和导出的实例详解
2019/7/10 22:41:23
本文主要是介绍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")
如有疑问请留言或者到本站社区 交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
这篇关于C++ 中动态链接库--导入和导出的实例详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升