动态库静态库笔记

命名

linux下,动态库以.so结尾,静态库以.a结尾
libxxx.a/libxxx.so
gcc链接这些库的时候使用的是该库的名字xxx而不是全称libxxx.a

静态库制作和使用

静态库制作

gcc -c 命令处理.c文件生成.o文件,-c命令表示只编译不链接这些生成的.o文件
ar -rcs 将各个.o文件打包成静态库
静态库需要一个.h头文件来提示内部包含什么函数

静态库的使用

比如在main.c中要使用该库中的函数
要在开头添加.h文件,声明可以使用的函数,想想stdio.h等c标准库也是这样用的
gcc编译main.c的时候, -I参数 include头文件所在目录, -L 参数添加静态库文件所在目录, -l 参数指示要使用库名称, -o 参数指定生成的可执行程序的文件名

动态库制作和使用

动态库的制作

gcc -c -fpic 生成位置无关的.o文件
gcc -shared a.o b.o -o libmyshare.so 生成myshare动态库,linux下动态库以so结尾

动态库的使用

同样添加.h文件声明可以使用的函数
gcc 命令编译main.c时, -I参数 include头文件所在目录, -L 参数添加静态库文件所在目录, -l 参数指示要使用的库名称,以上面的libmyshare.so为例,就是-lmyshare
这样动态库的信息就包含在生成的可执行程序中了,例如刚刚生成的可执行程序文件名为app,可以通过ldd命令list dynamic dependencies列出所有依赖的动态库

到这里还有最后一个值得注意的地方,这个时候执行app会报错,找不到libmyshare.so文件

动态库的特点是,在运行程序时,调用到动态库中的函数才会将动态库加载到内存中
那么运行时的操作系统如何找到动态库并加载到内存中?
对了,就是环境变量等一系列的默认位置,包括/lib /usr/lib等目录
所以还需要将动态库文件放在这些目录下,或者将库文件所在路径放在环境变量中,让操作系统知道位置,一些C的标准库也是通过动态的方式加载的

posted @ 2023-01-09 19:06  ecnu_lxz  阅读(31)  评论(0编辑  收藏  举报