【博客122】( 一 ) Linux—静态库

内容: 在公司实习的时候,频繁需要打包各种库,所以就把静态库和动态库又复习了一次。先记录下静态库吧

静态库的含义:静态库其实就把.o文件打包。然后在程序的链接阶段被链接到了程序中,与程序运行时
没有关系。链接生成需要的.o文件之后,静态库可以删除,不影响生成的可执行文件的执行。这样就可
实现将公共的.o文件打包起来,在后续程序需要的时候编译链接库就可以。且因为封装成库,别人能看
到h文件的函数声明,无法看到函数定义。不过静态链接库的一个缺点是,如果我们同时运行多个程序,
并且它们使用了同一个库函数,这样,在内存中会大量拷贝同一库函数。这样,就会浪费很多内存空间
和存储空间。如果使用了共享链接库的Linux就可以避免这个问题,下一篇讲动态库

准备好我们的测试文件:
test.c
在这里插入图片描述
add.c
在这里插入图片描述
add.h
在这里插入图片描述
生成我们的静态库:

gcc -c add.c -o add.o
ar cr libadd.a add.o

在这里插入图片描述
链接静态库,生成我们的目标文件

生成:
gcc test.c -o test -I. -L. -ladd
执行:
./test

结果:
在这里插入图片描述
这样我们就完成了简单的静态库实践,下面再分享几个命令

1.查看test可执行文件中,是否链接进去了add:
nm test | grep "add"

在这里插入图片描述

2.查看库里面有哪些.o文件以及里面的符号
nm libadd.a

在这里插入图片描述

3.查看test里面没有定义的符号,也就是需要动态链接的
nm -u test.o

在这里插入图片描述
是不是有疑问:未定义的符号,为啥test还可以生成呢?并且还成功运行了?
答:因为有系统库,printf这些函数你包了stdio.h头文件,那你没有提供实现呀,
那你为啥可以用呢?因为编译器会帮你链接系统的库。

4.查看你的可执行文件依赖了哪些库?
add test

这几个就是系统库啦,比如你的printf这些的实现就在这些系统库里面。然后动态库已经链接进去了
不在这里显示。
在这里插入图片描述

大四学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。

发布了158 篇原创文章 · 获赞 34 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43684922/article/details/103328953
122