内容: 在公司实习的时候,频繁需要打包各种库,所以就把静态库和动态库又复习了一次。先记录下静态库吧
静态库的含义:静态库其实就把.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这些的实现就在这些系统库里面。然后动态库已经链接进去了
不在这里显示。
大四学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。