目录
一、库文件
1.定义
库是一组预先编译好的方法的集合。
2.linux系统存储库的一般位置
位置:/lib和/usr/lib。
注意:库的头文件一般存储在/usr/include下或子目录。
3.库的分类
①静态:命名规则 libxxx.a
②共享库(动态库):命名规则 libxxx.so
二、静态库的生成和使用
1.静态库的生成
假设此时有多个源文件,比如file1.c和file2.c,将它们打包成一个静态库。
①将需要生成库文件的所有".c"文件编译成".o"文件
gcc -c file1.c
gcc -c file2.c
②使用ar命令将所有的".o"文件生成静态库
ar crv libmylib.a file1.o file2.o
其中:c表示创建库 r表示将方法添加到库中 v表示显示过程
2.静态库的使用
gcc -o main main.c -L. -lmylib
注意:
① -L 指定库的存储路径(表示库文件所在目录)
②-l 后面跟库名(不带前缀lib
和后缀.a
)
三、共享库的生成和使用
1.共享库的生成
假设此时有多个源文件,比如file1.c和file2.c,将它们打包成一个共享库。
①将需要生成库文件的所有".c"文件编译成".o"文件
gcc -c file1.c
gcc -c file2.c
②使用gcc命令将所有的".o"文件链接生成共享库
gcc -shared -fPIC -o libmylib.so file1.o file2.o
2.共享库的使用
gcc -o main main.c -L. -lmylib
注意:
① -L 指定库的存储路径(表示库文件所在目录)
②-l 后面跟库名(不带前缀lib
和后缀.so
)
3.强调
①直接执行会出错:是因为系统默认只会去存储库的标准位置(/lib或/usr/lib等)加载,所以要将库拷贝到/usr/lib下,再执行程序。也可以通过设置环境变量"LD_LIBRARY_PATH"
指定的路径。
②通过ldd命令查看可执行程序使用了哪些共享库。(ldd 可执行程序)
③如果库的存储路径有同名的共享库和静态库,则默认使用共享库。
四、共享库和静态库的区别
静态库在链接时将用到的方法包含在最终生成的可执行程序中。静态库中如果删除库文件,仍然可以运行(静态库在编译时被复制到程序中,生成的可执行文件内部包含了所有静态库的代码。)
动态库不包含,只做标记,运行程序时,才动态加载。动态库中删除库文件,程序运行时出现错误。(共享库只存在一份,可以被多个程序共享使用)