【Linux】动静态库@基础IO 您所在的位置:网站首页 makefile指定库文件搜索路径 【Linux】动静态库@基础IO

【Linux】动静态库@基础IO

2023-04-22 09:37| 来源: 网络整理| 查看: 265

制作动静态库1. 动态库 & 静态库2. 制作静态库2.1 制作2.2 使用3. 制作动态库3.1 制作3.2 使用4. 总结

我们其实一直都在直接或间接的使用库,本文将介绍动静态库的制作和使用。

从今天开始,你的朋友说,诶?你的作业借我看看。你就可以,哦不你也应该,勇敢的做个高尚的人,制作一个库扔给他~

正文开始@呀小边同学

💛 显示可执行程序依赖的库。或者说查看依赖的动态库,因为静态链接会把这个模块拷贝到可执行文件中了,也就没有依赖而言了

ldd [某可执行程序]

于是我们查看一下可执行程序mytest依赖的库,诶,在茫茫人海中,发现了C标准库 ——

【Linux】动静态库@基础IO —— 动静态库的制作使用_动态库

查看发现,这是一个软链接,它最终指向的是libc-2.17.so:

【Linux】动静态库@基础IO —— 动静态库的制作使用_静态库_02

这就是我们使用的C标准库,它的大小是 2156592 这么些。我们使用的标准IO、字符串操作和整数数学函数所谓的这些的库,也不过是安装在系统中的文件罢了。

【Linux】动静态库@基础IO —— 动静态库的制作使用_linux_03

那我们再来看看C++的库?stdc++:

【Linux】动静态库@基础IO —— 动静态库的制作使用_服务器_04

(其中.cc/.cpp/.cxx都可作为C++文件的后缀,当然了,常用的还是前两个,被见怪就行了)

1. 动态库 & 静态库

💛 旧知复习

在Linux中,一般库分为两种:动态库和静态库,它们就是文件!

动态库:库文件以.so为后缀;静态库:库文件以.a为后缀(archieve 一种称为存档的特殊文件格式)。

库文件的命名规则:libname.so 或者 libname.a [.后面可能跟其他的内容]

库的真实名字:掐头去尾就是库名称。即去掉lib前缀并去掉.so/.a后缀,如上文中的c库。

(在windows中,动态库以.lib为后缀,静态库以.dll为后缀)

从前从前,我们就说过,gcc默认是动态链接编译,静态编译需要带选项-static:

【Linux】动静态库@基础IO —— 动静态库的制作使用_服务器_05

观察到动态链接时文件体积较小,静态链接时文件体积较大。这是因为静态库是在链接时,会复制程序引用的目标模块到可执行程序中。而所谓共享动态库,实际上是通过虚拟地址空间映射到同一位置,这样生成的可执行文件体积小,但是可移植性差。

后悔CSAPP没好好学(

【Linux】动静态库@基础IO —— 动静态库的制作使用_linux_06

我现在用到的服务器,没有内置语言的静态库,而只有动态库,需要yum安装C/C++静态库。

sudo yum install glibc-static sudo yum install libstdc++-static

这都是小事儿。

另外,我们很多Linux命令是用C语言写的,而且是动态链接的 ——

【Linux】动静态库@基础IO —— 动静态库的制作使用_静态库_07

所以如果你把C语言库干掉了,那你的系统就寄了,当然了如果你是云服务器,不拍折腾的宝子可以试试。。

💛 下面即将介绍动静态库的制作和使用

我们可以打开刚刚的C标准库,发现就是人类看不懂的二进制文件 ——

【Linux】动静态库@基础IO —— 动静态库的制作使用_运维_08

那我们如何得知,这个库给我们提供了哪些方法?

实际上一套完整的库是要包括三样东西:库文件本身、头文件、说明文档。

我们在写C/C++代码时,有时候将头文件和源文件分离:在.h中放入声明,在.c或.cpp放入实现。为什么要这样设计?

原因之一就是我们要制作库,这样方便使用,且私密。其中头文件是人类能理解的文本,会暴露出库中方法的基本使用。

这些头文件被安装在usr/include/目录下,可以看到一些熟悉的头文件:

【Linux】动静态库@基础IO —— 动静态库的制作使用_静态库_09

随意打开其中的 stdio.h,哦豁~

【Linux】动静态库@基础IO —— 动静态库的制作使用_服务器_10

2. 制作静态库

💛 准备工作:

【Linux】动静态库@基础IO —— 动静态库的制作使用_服务器_11

(把我们刚刚一堆的测试文件挪到other目录下)

我们想在mytest.c这个文件中使用这个“库”,但是并不能编译通过。

【Linux】动静态库@基础IO —— 动静态库的制作使用_动态库_12

报错是gcc不能找到库的源文件,因此我们在编译时要跟上源文件位置 ——

gcc user.c test_lib/add.c test_lib/sub.c

yeah~

【Linux】动静态库@基础IO —— 动静态库的制作使用_运维_13

但我们不想止于此,这还远不能称为制作库。

众所周知,程序的编译运行经历了如下过程:

【Linux】动静态库@基础IO —— 动静态库的制作使用_动态库_14

如果想把我们自己的方法给别人用,你固然可以提供源代码和头文件,但是我们不想把源文件给别人——于是将所有的.o打包成库,照样可以链接成功。制作库的本质就是,把一堆.o文件以某种方式打包。

下面来讨论具体细节。

2.1 制作

我们会在test_lib目录下写这样一个Makefile文件 ——

【Linux】动静态库@基础IO —— 动静态库的制作使用_静态库_15

可能你看着眼晕,但其实特简单!

🔸 1. 将库文件全部编译为.o

🔸 2. 再用ar命令,把所有的.o打包在一起

ar -rc libname.a [待打包.o] ar是gnu的归档工具,相当于打包成指定名称的文件 rc表示replace and create

🔸 3. 可以make output 发布库

要把.h文件也给别人哦~ 这样人类才知道你库里面有什么

从今天开始,你的朋友说,小边啊!你的代码借我看看。你,你就应该勇敢的做个高尚的人,制作一个库output丢给他~

Makefile文件贴给宝子们,你最好,哦不,你也应该自己闭上眼睛来写 ——

lib_mymath.a:add.o sub.o ar -rc lib_mymath.a $^ %.o:%.c gcc -c $< .PHONY:output output: mkdir output cp *.h output cp lib_mymath.a output .PHONY:clean clean: rm -rf *.o lib_mymath.a output其中%表示通配符 $


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有