欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux 中静态库、动态库的创建及使用

程序员文章站 2022-06-09 17:37:33
...

异同点

  • 静态库:文件名默认为 libXXX.a,就是可重定位目标文件的集合。编译时 gcc 会将静态库中的依赖打包到可执行文件
  • 动态库:文件名默认为 libXXX.so,执行时需要动态加载依赖

创建并使用静态库

创建静态库

创建 sub.csub.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
相关标签: 静态库 动态库