前言

动态库的概念:
动态库提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,
该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。
多个应用程序可同时访问内存中单个 DLL 副本的内容 — 百度百科

之前有写过手把手教你C语言静态库的开发
静态库的缺点:当你调用静态库编译后,生成exe后。静态库的东西都会直接嵌入到里面。
这样你的exe程序会很大。而动态库则是动态的调用的。它和你的exe程序是分开的,是动态的调用。
动态库十分的方便,比如你写了一个程序,如果想要更新它,只需把相对应的动态库更新一下就行了。

废话不多说,接下来写一个最简单的动态库。

写一个简单的动态库

先创建一个动态库项目:

在项目里创建一个demo.cpp一个demo.h。
两个文件的内容分别如下图所示:



编译一下,可以看到我们的动态库文件已经生成。

这时候用一个叫depends的程序打开我们的dll文件。
depends软件下载的官网链接:http://www.dependencywalker.com/



再用depends软件随便找一个dll文件打开
可以看到如下图所示:


通过上面两个图片的对比你会发现我们写的动态库文件打开后,没有显示我们写的函数。即没有导出接口。
通俗的来说就是,我们写了一个库,但是没有接口,别人显然是用不了。
所以我们得弄一个接口。

接下来我们只需在头文件里,把我们的函数导出来就可以了。

再编译一下,在打开看一下,会发现已经有导出接口了。

使用动态库

接下来就是使用要我们的静态库了。
我又创建了一个新的文件夹,并在该文件夹下创建了一个新的项目。
将我们刚才写的动态库的头文件和.lib文件.dll复制到该目录下。
如下图所示:


这里把这两个文件复制到该目录下的目的是: 该项目的工作空间默认是这里,直接弄到这里就不用来配置demo.h和demodll.lib和demodll.dll的路径了。方便使用。


运行一下,看下效果。


为了防止将动态库和静态库弄混,看一下 下面这张图。

直接只运行一个exe而没有dll你会发现会报这个错误,因为没有动态库.dll文件。但是当我们用静态库直接运行exe时并不会报错。
于是你就会发现,静态库是嵌入到exe里面的,而动态库不是嵌入到exe里面的是和exe分开存在的。

上面那种使用动态库的方式是隐式调用,接下来动态的调用动态库。

运行之后你会发现并没有成功,这是因为我们的导出函数并没有加载成功

你会发现我们的导出函数的名称是有点乱码的,并不是sum,sub。
当我们把加载的导出函数名称改成这些乱码的名称后,程序就正常与运行了。

如下图所示:

那么为啥导出来的函数是乱码呢?
这是因为我们用的是c++的语法,在导出的时候就会将导出来的函数名是乱码
用C语言的语法导出函数就不会出现乱码如何解决呢?
有两种方法:方法一、在写动态库时用.c即C语言的语法导出。结果就不会是乱码了。方式二,在写动态库时用.cpp即C++的文件但是用c语言的语法导出。方法三,用微软提供的模块定义文件直接定义
具体操作如下:

方式一:

这时候你就可以直接用sum,sub了而无需用乱码了。

方式二:

这样也是可以的没有乱码的。


方法三:

用微软提供的模块定义文件直接定义。
无需像第一种将.cpp改为.c
也无需像第二种将函数的导出用extern "c"来导出。
直接在模块定义文件直接定义就可以了。



没有乱码之后直接用sum,sub就可以了。

手把手教你写C语言的动态库的开发相关推荐

  1. 易语言 标准c 动态库,易语言Dll动态库的开发

    一.关于易语言DLL 易语言Dll动态库的开发是编程当中和其他语言开发进行交互必不可少的方法之一,从易语言3.6版开始,已经能够支持对DLL动态链接库的开发, 编译出的DLL是标准的DLL,和其他编程 ...

  2. Android 开发之手把手教你写 ButterKnife 框架(三)

    系列文章目录导读: Android开发之手把手教你写ButterKnife框架(一) Android开发之手把手教你写ButterKnife框架(二) Android开发之手把手教你写ButterKn ...

  3. 手把手教你写网站:Python WEB开发技术实战

    摘要:本文详细介绍了Python WEB开发的基础入门.以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程.通过本文的学习可以快速掌握基于Django的Python WEB的开发 ...

  4. 网易教程python_手把手教你写Python网络爬虫(1):网易云音乐歌单

    摘要:从零开始写爬虫,初学者的速成指南! 需要免费获取本文章讲解的视频+源码,关注+转发此文然后私信我回复"音乐"即可领取资料,也欢迎大家和我一起交流学习Python,共同成长 封 ...

  5. 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫

    系列教程 手把手教你写电商爬虫-第一课 找个软柿子捏捏 如果没有看过第一课的朋友,请先移步第一课,第一课讲了一些基础性的东西,通过软柿子"切糕王子"这个电商网站好好的练了一次手,相 ...

  6. python k线合成_手把手教你写一个Python版的K线合成函数

    手把手教你写一个Python版的K线合成函数 在编写.使用策略时,经常会使用一些不常用的K线周期数据.然而交易所.数据源又没有提供这些周期的数据.只能通过使用已有周期的数据进行合成.合成算法已经有一个 ...

  7. 手把手教你写DI_2_小白徒手撸构造函数注入

    在上一节:手把手教你写DI_1_DI框架有什么? 我们已经知道我们要撸哪些东西了 那么我们开始动工吧,这里呢,我们找小白同学来表演下 小白同学 :我们先定义一下我们的广告招聘纸有什么: 好,我们实现两 ...

  8. 手把手教你写专利申请书/如何申请专利

    摘要 小前言 (一)申请前的准备工作     1.申请前查询     2.其他方面的考虑     3.申请文件准备 (二)填写专利申请系列文档     1.实际操作步骤     2.具体操作     ...

  9. socket 长链接linux,手把手教你写 Socket 长连接

    原标题:手把手教你写 Socket 长连接 8点43分打卡 就是真爱 本文转载自公众号 玉刚说,由玉刚说写作平台[1]提供写作赞助 原作者:水晶虾饺[2] 版权声明:本文版权归微信公众号玉刚说所有,未 ...

最新文章

  1. [Leetcode] Max Area of Island 最大岛屿面积
  2. Android Toolbar 标题居中及字体样式自定义
  3. 解决hal.dll丢失问题 调试方法启动XP
  4. 20145201李子璇 《网络对抗》恶意代码分析
  5. 试验设计与matlab数据分析 下载,试验设计与MATLAB数据分析(附光盘)
  6. 前端学习(3206):初始化state
  7. 论文投稿新规则,不用跑出SOTA,还能“内定”发论文?!
  8. Tensorflow 学习二 tf.Session().run
  9. python安装json模块_python 标准模块之json 模块
  10. PS网页设计教程XIV——如何创建一个复古风格的PS布局
  11. 结构之法算法之道CSDN博客-第一期全部博文集锦[CHM 文件下载]
  12. Hive的行转列及列转行函数使用总结
  13. OpenInventor笔记:线性坐标轴PoLinearAxis的使用
  14. Linux上像windows的FinalData的修復工具
  15. Python判断一个数是否为质数
  16. 列宽一字符等于多少厘米_Excel中行高多少等于1厘米?列宽多少等...
  17. target triplets
  18. 马上2021年了线性表你还不知道原理?给老王整的明明白白
  19. 可视化降维方法 t-SNE
  20. 剑侠世界2手游为什么不显示服务器,《剑侠世界2》手游好玩不好玩?这篇采访全都告诉你...

热门文章

  1. Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别
  2. css中使用id和class 的不同
  3. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
  4. uniGUI试用笔记(十一)
  5. framebuffer 保存 bmp图片格式
  6. Linux platform总线(1):总体框架
  7. ESP8266编译脚本之四
  8. Kaggle债务违约预测冠军经验分享
  9. python调用电脑蜂鸣器一直响_电脑开机蜂鸣器一直响,9声滴~,什么问题?怎么处理?...
  10. 区块链BaaS云服务(21)腾讯CCGP”安全沙箱“