Linux 下静态库与动态库的制作与使用
文章目录
- Linux 下静态库与动态库的制作与使用
- 示例代码:
- 静态库
- 静态库制作
- 静态库使用
- 动态库
- 动态库制作
- 动态库使用
示例代码:
-
test.c
-
test.h
-
main.c
静态库
静态库制作
- 以示例代码为例,先执行下面命令,生成 .o 文件
gcc -o test.o -c test.c
- 通过ar命令创建静态库
/*静态库必须以 lib 为前缀,文件拓展名为 .a*/
ar -rsv libtest.a test.o
静态库使用
- 使用静态库时,如示例代码main.c所示,包含头文件,下面以编译时.a文件在当前目录为例
/*
-L 表示添加库的搜索路径,. 代表当前目录
-l 注意是小写的L,代表库的名称
静态库的真正名称 = libhello.a 去掉前缀 lib 和 后缀 .a
*/
gcc main.c -o main -L. -ltest
- 最后执行
动态库
动态库制作
- 以示例代码为例,先执行下面命令,生成 .o 文件
/*如果 test.c 用到了其他 .c文件,比如add.c、sub.c,相关文件也需要生成目标文件。*/
gcc -fPIC -o test.o -c test.c
这里新增了 -fPIC 选项,实际上改变的是 hello.o 的符号表,我们可以使用 nm 命令查看hello.o的符号表,多出了一个全局偏移表,没有这个偏移表是无法动态编译的。
- 使用下面命令,生成动态库
/*gcc -shared -o libxxx.so xxx.o xxx.o ... */
gcc -shared -o libtest.so test.o
动态库使用
- 修改环境变量 LD_LIBRARY_PATH,将当前目录增加到环境变量中
export LD_LIBRARY_PATH=./
- 只是在当前 Shell 环境下有效,如果新开一个终端,相当于创建了一个新的Shell环境,该环境下的环境变量LD_LIBRARY_PATH是空的。
- 环境变量 LD_LIBRARY_PATH是动态库的搜索路径,一般情况下为空,可执行文件运行时,会去这个环境变量中搜索动态库路径
- 使用下面命令编译main.c文件
/*与静态库使用时的编译命令一致*/
gcc main.c -o main -L. -ltest
ldd 命令可以查看当前执行文件所链接的动态库
- 最后执行