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

异同点

  • 静态库:文件名默认为 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值