一、静态库
1.静态库的创建:
- 1.编译源文件为目标文件
- gcc -c demo1.c
- 2.将目标文件打包
- ar rs libdemo.a demo1.o
2.静态库的使用:
- 1.-L选项用于指定库的路径
- 2.-l选项用于指定库的名称 libstack.a的库名:stack
- 3.举例:gcc main.c -L. -lstack
3.编译时库的搜索顺序:建议对照头文件的搜索顺序理解:
- 1.优先查找-L选项指定的路径。
- 2.查找LIBRARY_PATH环境变量指定的路径
- 3.查找系统默认的库路径:/lib /usr/lib …
4.静态库的特点:
- 1.静态库就是一系列目标文件的集合
- 2.静态库的在链接时,会被真正链接到可执行文件中。
- 3.静态库中往往包含了很多函数符号,在链接中只链接用到的函数符号,没有用到的,就不会被链接。
5.静态库的与共享库的区别:
- 1.在链接共享库时,并不会真正的做链接,所以在运行时仍然需要依赖于共享库。
- 2.在链接静态库时会将用到的函数符号真正的链接到到可执行文件中,所以在运行时,不用依赖用到的静态库。
6.查找-l指定的库时,如果静态库和共享库同时存在,优先使用共享库。
二、共享库:
1.共享库的创建:
- 1.将源文件编译成位置独立(PIC)的目标文件
- gcc -c -fPIC *.c
- 2.使用gcc的share选项生成共享库
- gcc -shared -olibdemo.so *.o
2.共享库的使用:
1.编译:
- gcc main.c -L. -lstack
2.编译时库的查找顺序与静态库相同。
3.运行时共享库的查找:
- 1.首先查找LD_LIBRARY_PATH环境变量指定的路径。
- 2.查找/etc/ld.so.cache,该缓存文件由ldconfig工具读取/etc/ld.so.conf文件(当然还包括其他文件)来生成。
- 3.查找系统缺省库目录:先是/usr/lib 其次是/lib
三、相关库工具的使用:
1.ldconfig
ldconfig -v 命令生成缓存文件,需要root权限,每次修改相关配置文件,都需要执行此操作。
2.ldd
列出可执行文件的库依赖。比如ldd a.out
3.nm
主要用于列出函数符号,与我们写的函数名是一样的。
4.strip
去除指定目标文件,库文件中的调试信息,去除了以后就变成不可调试的。
5.objdump
显示目标文件的内部结构
相关文档下载:Linux_compile_util
关于C语言静态库与共享库及其相关工具