Linux 中静态库、动态库的创建及使用
程序员文章站
2022-06-09 17:37:33
...
异同点
- 静态库:文件名默认为
libXXX.a
,就是可重定位目标文件的集合。编译时 gcc 会将静态库中的依赖打包到可执行文件 - 动态库:文件名默认为
libXXX.so
,执行时需要动态加载依赖
创建并使用静态库
创建静态库
创建 sub.c
和 sub.h
两个文件,用于创建静态库:
int sub(int x, int y) {
return x - y;
}
#ifndef _SUB_H_
#define _SUB_H_
int sub(int, int);
#endif
然后,通过 -c
选项编译为可重定位目标文件,注意不要链接成可执行目标文件:
gcc -c -o sub.o sub.c
最后,用 ar 归档命令打包:
ar -cr libsub.a sub.o
使用静态库
首先,在代码中引入头文件:
#include <stdio.h>
#include "sub.h"
int main() {
int ret = sub(5, 4);
printf("%d\n", ret);
return 0;
}
然后,编译。gcc 命令通过 -L
选项指定静态库的路径,通过 -l
选项指定静态库名字,注意这两个选项跟参数之间都没有空格:
gcc main.c -L. -lsub
创建并使用动态库
在基于 GNU glibc 的系统里,启动一个 ELF 格式的二进制可执行文件会自动启动和运行一个程序加载器 program loader。Linux 系统中这个 loader 的名字是 /lib/ld-linux.so.X
(X是版本号)。这个 loader 启动后,就会加载本程序要使用的共享函数库。默认路径在 /etc/ld.so.conf
文件里。
创建动态库
动态库跟静态库创建时,区别在最后一步,静态库通过 ar 命令将可重定位目标文件归档,而动态库需要通过 gcc 命令创建。
gcc -shared -fPIC -o libsub.so sub.o
PIC 的意思是“位置无关代码”(Position Independent Code)
使用动态库
静态库和动态库在使用时,gcc 的编译参数是一样的:
gcc -main.c -L. -lsub
运行使用了动态库的 ELF 文件
使用动态库编译的可执行文件,在执行时必须让操作系统找到相关的动态库才可以。否则报错:
./a.out: error while loading shared libraries: libsub.so: cannot open shared object file: No such file or directory
将动态库添加到默认查找目录:
Linux 默认在 /lib
和 /usr/lib
中查找动态库。添加到任一个目录中即可。
设置环境变量:
export LD_LIBRARY_PATH=/path/to/your/lib:$LD_LIBRARY_PATH
echo $LD_LIBRARY_PATH
在 /etc/ld.so.conf
中加入动态库所在的目录
首先编辑 /etc/ld.so.conf
文件,加入目录:
然后重新加载配置:
ldconfig
上一篇: Linux--静态库、动态库
下一篇: WPF中关于ListBox绑定数据的问题