0. 基本
- 在命名上,静态库的名字一般是 libxxx.a,动态库的名字一般是 libxxx.so,有时 libxxx.so.major.minor,xxx 是该 lib 的名字,major 是主版本号,minor是副版本号。
-
linux 系统存放函数库的目录:/lib(/lib64),/usr/lib(/usr/lib64)
lrwxrwxrwx. 1 root root 7 Sep 2 22:24 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Sep 2 22:24 lib64 -> usr/lib64
1. 判断一个程序有没有链接程序库
- file:查看文件类型;
- ldd:将所有依赖的动态函数库取出来查阅;
$ ldd $(which sshd)
# which sshd ⇒ /usr/bin/sshd
$ ldd $(which sshd rsyslogd xinetd httpd)
2. 静态库与动态库的编译
-
静态库:
- 1、生成目标文件:
$ gcc -Wall -c file1.c file2.c file3.c # 不用指定生成.o文件名(默认生成file1.o, file2.o, file3.o)。
- 2、从.o目标文件创建静态连接库:
$ ar rv libNAME.a file1.o file2.o file3.o
r : 将flie1.o, file2,o, file3.o插入archive,如故原先archive中已经存在某文件,则先将该文件删除。
v : 显示ar操作的附加信息 -
动态库:
- 1、生成目标文件
$ gcc -Wall -c -fpic file1.c file2.c file3.c # 可选参数 # -g:生成调试信息,供 gdb 使用 # -o0:指定编译优化级别
fpic: 指定生成的.o目标文件可被重定址. pic是position idependent code的缩写: 位置无关代码.
- 2、生成动态库文件
$ gcc -shared -o libNAME.so file1.o file2.o file3.o
一般地, 连接器使用main()函数作为程序入口. 但在动态共享库中没有这样的入口. 所以就要指定-shared选项来避免编译器显示出错信息.
- 3、上述两条命令可以合并为:
$ gcc -Wall -shared -fpic -o libNAME so file1.c file2.c file3.c