网站设计不需要考虑,网站建设情况的汇报,wordpress最大文件,还有那个网站可以做兼职呢目录
动静态库的制作
前置知识
库的基本构造
问题
分析
要给什么文件
如何更好的让别人使用
库的生成
静态库的生成
makefile参考
动态库的生成
makefile参考#xff08;包含动态库和静态库生成#xff09;
库的使用
法一#xff1a;放入系统路径
弊端
法二…
目录
动静态库的制作
前置知识
库的基本构造
问题
分析
要给什么文件
如何更好的让别人使用
库的生成
静态库的生成
makefile参考
动态库的生成
makefile参考包含动态库和静态库生成
库的使用
法一放入系统路径
弊端
法二放入环境变量
弊端
法三放入配置文件 动静态库的制作
前置知识
要学会制作动态库必须要有软硬链接知识的基础大家可以移步至该文章软链接和硬链接的详解 Linux系统下-CSDN博客
库的基本构造
问题 问题 我们都知道代码有源文件头文件那么请问我们要将自己实现的代码给他人使用时应该给哪些文件给他们呢 分析
要给什么文件 1、头文件要给别人吗 答肯定要我们使用库里面的函数一定需要包含头文件才能使用 2、源文件要给别人吗 答情况分两种 愿意开源和别人一起进步可以 保护自己的知识产权暂不开源不要 3、源文件不给别人的时候应该怎么做呢 答给编译后的文件别人看不了你的代码实现ψ(∇´)ψ 也就是gcc -c 源文件名 -o 编译后的文件名.o后形成的文件这样的文件属于二进制文件别人看不了你的代码实现但是计算机看得懂
如何更好的让别人使用
我们通常不会只有一个头文件和源文件因此生成的.h文件和编译后生成的.o文件不止一个因此需要对各个文件分类进行打包压缩我们通常采用如下处理办法 头文件 放入一个名为include的文件夹 .o文件: 打包成库分为静态库和动态库静态库以.a结尾动态库以.so结尾 库的生成
静态库的生成 问题 若我们有如下文件myprint.c,mymath.c,myprint.h,mymath.h,请问我们要干什么呢想想前面讲的哦 答案 头文件放入一个include文件夹下 库文件 先都gcc -c 源文件名 -o 编译后的文件名.o生成.o文件 再将所有.o文件打包为.a文件也就是静态库 下面的问题就是 怎么打包生成.a文件 答 当我们的.o文件都生成后我们要输入一下命令来打包 ar -rc liboutput.a myprint.o mymath.o 命令解析 artar的缩写 rreplace ccreat liboutput.a:命名规范 lib库文件前缀这是命名要求 output库文件名 ︶↗敲重点 .a静态库后缀也是命名要求 .o要被打包的.o文件列表
makefile参考
以上的各个步骤可以用makefile来完成以下是makefile的参考
# 静态库
liboutput.a:myprint.o mymath.o
# .a:静态库后缀ar -rc liboutput.a myprint.o mymath.o# ar:归档# -rc: # r:replace# c:creatmyprint.o:myprint.cgcc -c myprint.c -o myprint.o# -c:编译
mymath.o:mymath.cgcc -c mymath.c -o mymath.o
.PHONY:output
output:mkdir -p output/libmkdir -p output/includecp *.h output/includecp *.a output/lib
.PHONY:clean
clean:rm -f *.o *.a 起始 输入make后会生成.o文件和.a文件 输入make output后会生成output文件夹下面是 include文件夹 存放.h文件 lib文件夹 存放.a文件 输入make clean就会清除那些不需要的文件啦 我们发布库给别人用的时候只需要将output给别人就好啦
动态库的生成
同样我们也是要将.o文件打包但是动态库是打包为.so文件 生成.o命令 gcc -fPIC -c 源文件名 -o 要生成的.o文件名 打包.o文件 gcc -shared .o文件列表 lib库文件名.so 用上面的的myprint.c,mymath.c举例 生成.o文件 myprint_d.o:myprint.cgcc -fPIC -c myprint.c -o myprint_d.o# -c:编译# -fPIC:生成与位置无关的二进制文件
mymath_d.o:mymath.cgcc -fPIC -c mymath.c -o mymath_d.o 打包.o文件为.so文件 liboutput.so:myprint_d.o mymath_d.ogcc -shared -o liboutput.so myprint_d.o mymath_d.o
makefile参考包含动态库和静态库生成
注意里面的all的妙用
.PHONY:all
all:liboutput.a liboutput.so
# 静态库
liboutput.a:myprint.o mymath.o
# .a:静态库后缀ar -rc liboutput.a myprint.o mymath.o# ar:归档# -rc: # r:replace# c:creatmyprint.o:myprint.cgcc -c myprint.c -o myprint.o# -c:编译
mymath.o:mymath.cgcc -c mymath.c -o mymath.o
# 动态库
liboutput.so:myprint_d.o mymath_d.ogcc -shared -o liboutput.so myprint_d.o mymath_d.omyprint_d.o:myprint.cgcc -fPIC -c myprint.c -o myprint_d.o# -c:编译# -fPIC:生成与位置无关的二进制文件
mymath_d.o:mymath.cgcc -fPIC -c mymath.c -o mymath_d.o
.PHONY:output
output:mkdir -p output/libmkdir -p output/includecp *.h output/includecp *.a output/libcp *.so output/lib
.PHONY:clean
clean:rm -f *.o *.a *.so
现在我们的库就可以拿给别人去使用啦还没有完哦
库的使用
我们直接将刚刚制作的output文件夹给用户使用就好啦~~~ 自己制作的库的使用有三种办法 放进系统查找库函数的路径下(静态库) 导入环境变量动态库 放入/etc/ld.so.conf.d/的配置文件中 法一放入系统路径 编译器编译时默认去以下路径查找文件 头文件/usr/include 库文件/lib64或/usr/lib64 大家将自己的头文件和库文件分别放入这两个路径就好啦
脑子不好的小菜鸟就不演示啦因为这样子有弊端哦~(▽)~*
弊端 放在系统路径下的文件都是经过了长时间的检验的其可靠性非常强但是我们自己的头文件和库文件并没有经过检验如果我们在后续长期使用中发现这个文件有问题那将是非常非常麻烦的有如下原因 库函数不止一个人使用因为通常是整个小组甚至是整个公司使用如果这个库函数出了问题则将影响公司 时间久了你也搞不清楚是哪个文件的问题这就需要运维人员去查找日志信息这花费时间和精力 法二放入环境变量
要输入以下命令
export LD_LIBRARY_PATH$LD_LIBRARY_PATH:该动态库的路径 注意(ov)ノ 要的是路径不需要带上该动态库文件名 (´▽ʃ♡ƪ)
弊端
xshell退出后这个环境变量中就没有我们加的路径了因为这是内存级环境变量所以这种方法不适用于长期使用的库
法三放入配置文件
这种方法是推荐的Linux中有一个专门让我们放置配置文件的/etc/ld.so.conf.d/这个路径是保存自定义配置搜索库路径的解决方案 步骤 进入该目录下 cd /etc/ld.so.conf.d/ 创建一个后缀为.conf的文件需要sudo权限 sudo touch zi_ji_de_ku.conf vim该文件要sudo权限 sudo vim zi_ji_de_ku.conf 将动态库的路径放入该文件中保存退出 退出后ldconfig 使得该配置文件生效 这样子我们就可以直接使用这个库啦 使用库的命令 gcc main.c -I 自己的库的头文件的路径 -L 自己的库的库文件路径 -l库文件名 命令解析 -I表示包含头文件 -L表示链接库 注意 后面跟的都是路径路径是不带文件名的实在搞不清楚可以先进入lib文件夹下再用pwd命令显示路径( •̀ ω •́ )✧ -l库文件名 注意 是库文件名去掉了库中的lib前缀和.a或者.so后缀 ------- 再次敲重点(●ˇ∀ˇ●) 将之前的文件进行演示 输入gcc main.c -I ./output/include -L ./output/lib -loutput -o main 注意这里的-I和-L后面都是路径哦路径是不带文件名的哦~ -l后面是库文件名哦并不是图片中的liboutput.so去掉了lib前缀和.so后缀哦 这样就会生成main这个可执行程序啦
完结撒花~~~~ ♪(^∇^*) ヾ(≧ ▽ ≦)ゝ你太棒啦~~~~,给你大大的赞 d(▽*)b
记得点个关注和收藏哦