C语言----创建工程库最佳选择(CSEN-e小白管理员-Half_word编写)
咕咕咕,这阵子事情有点多… …
===========================================================
正文:
C语言----创建工程库最佳选择
前阵子有童鞋问:“我写了一些功能很不错的代码;结果做课设了同学过来找我想借用,但是我又不想开源它们……。”于是引出来今天的主角”静态库”or”动态库”。
先简单进行一下科普:
1.静态库和动态库是什么?
动态库:动态库提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。
静态库:静态库是指在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。
不难看出,动态库貌似是一个大的“花心萝卜”,明明只有一个副本,却让同时访问的进程都以为这是它独有的库,最后运行的时候才进行载入。没错,这操作就是Windows专业手法;每个在windows上运行的进程也以为它独占了整个内存(实际上那都是线性地址)。
静态库相比之下就老实多了:每个使用它的进程都直接复制一份所需的代码,大家在生成可执行文件之前就明确了一一对应的关系。
上述两种库也体现出软件工程对于空间与时间的一种平衡取舍,静态库牺牲了空间,赢得了空间;动态库反之。另外值得一提的是使用动态库的程序不能离开动态库;所以经常在Windows下可以看到报错:缺少xx.dll。而静态库生成的程序就不存在这种限制了,为嘛?人家在运行之前加载进了程序。
2. 如何构建?
作为一个C语言热爱分子表示,做这种东西小菜一碟!
巴特,首先你得有一个运行环境……
本文主要以Windows与Linux两大系统为例(MCU小伙伴莫慌,Keil也可以使用lib文件的;传送门:https://blog.csdn.net/yunfeiyang62/article/details/47211209
Linux:
首先讲Linux,比起Windows来使用,因其操作更加简单。首先装机必备gcC;然后创建一个头文件(存放你的各种定义,以及函数原型声明);然后再将你的函数实现写入另外一个.c文件。
如下图1:

Windows:
作为微软主要的阵地,首先你得准备好一个VS2019(其它版本也可以,或者直接Keil)。
还是和linux里面一样建立一个头文件与.c文件。先保存好;再打开VS创建一个静态库工程或者是一个动态库工程。
库项目直接写在里面你的库函数,官方给了一套模板,要是觉得名字不好听右键>重命名(记得将头文件一并修改,还有将项目属性里面的也一并修改)
最后在工程目录的DEBUG目录下找到生成的.lib或.dll;取出并且与头文件一并打包。
3.如何使用?
由于Windows下使用较为复杂(keil中比VS来的简易),用文字描述过于繁琐
笔者给出传送门https://www.bilibili.com/video/BV1Kt411775b,自行探索。
仍然以Linux为例:
将你的.a与.so都用mv指令移动到/usr/lib/下;然后输入ldconfig建立连接关系。
创建一个mian.c,用#include “HelloH.h”包含前面写的头文件,然后把你需要的函数调用就好了。保存。
再输入:gcc -I./ main.c -lHello -o LibMain.out//使用静态库
gcc -L./ main.c -lHi -o SoMain.out//使用动态库
接着就可以执行查看效果了。
4. 如何分享?
其实说到这个,我们不妨打开电脑上随意一个程序得安装路径,可以看到:一堆的.dll或者.lib,有的是在lib文件夹中。
如果想给别人使用就创建两个文件夹吧include、lib;头文件送入include,库文件则放在lib。最后写个README,压缩出包,大功告成!