静态库(.a):
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
编译程序时候需要库作依赖,运行时候不需要。(方便,不再需要外部函数库支持)
缺点:
1、因为静态库被链接后直接嵌入可执行程序中,相当于每一个可执行程序里都有一个库的副本,浪费空间;
2、一旦库中有bug,需要重新编译。
创建步骤:
1、编写函数接口(.c)
vim file1.c
.......
vim file2.c
.......
2、
编译成.o文件
gcc -o file1.o -c file1.c
gcc -o file2.o -c file2.c
3、打包成库(库名称以lib开头)
ar -crs libmy.a file1.o file2.o
4、静态库使用(
编译程序
)
gcc -o main main.c -L. -lmy
5、直接运行
动态库(.so):
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
编译和运行程序都要有库作依赖。
创建步骤:
1、编写函数接口(.c)
vim file1.c
.......
vim file2.c
.
......
2、
编译成.o文件
-fPIC:表示生成位置无关代码(Position Independent Code)
gcc
-fPIC
-o file1.o -c file1.c
gcc -fPIC -o file2.o -c file2.c
3、打包成库(库名称以lib开头)
gcc -shared -fPIC -o libmy.so file1.o file2.o
4、静态库使用(
编译程序
)
gcc -o main main.c -L. -lmy
5、
①设置lib环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库存放的路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/76期/系统编程/005/code/sharedlib
②
直接把动态库文件拷贝到/lib或/usr/lib目录下
③
在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig
关于/etc/ld.so.conf:
里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig
6、运行
查看库依赖(ldd):
ldd 文件
看动态库,如果目标程序没有链接动态库,则打印“not a dynamic executable” (不是动态可执行文件)