Linux动态库生成与使用

本文深入讲解Linux下动态库的生成和使用流程,包括源文件编译、共享库生成、动态库链接及运行时库路径配置。通过具体实例,演示如何创建和调用动态库,以及解决动态库加载问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux下动态库文件名形如 libxxx.so (so 是 Shared Object,既共享的目标文件)。

在链接动态库生成可执行文件时,并不会把动态库的代码复制到可执行文件中,而是在执行文件中记录对动态库的引用。

程序执行时,再去加载动态库文件。如果动态库已经加载,则不必重复加载,从而节省内存空间。

Linux下生成和使用动态库的步骤

  • 编写源文件。
  • 将一个或几个源文件编译链接,生成共享库。
  • 通过 -L<path> -lxxx 的 gcc选项链接生成libxxx.so。
  • 把libxxx.so放入链接库的标准路径,或者运行时指定LD_LIBRARY_PATH, 才能运行链接了libxxx.so的程序。

 

实例

 

编写源文件

 

  • 建立一个源文件:max.c

  1 int max(int a, int b, int c)

  2 {

  3     int max_number = a;

  4     max_number = max_number < b ? b : max_number;

  5     max_number = max_number < c ? c : max_number;

  6     return max_number;

  7 }

 

  • 编译生成共享库:

gcc -fPIC -shared -o libmax.so max.o

可以得到 libmax.so 。上述过程分为编译链接两步, -fPIC时编译选项, PIC时Position Independent Code的缩写。

表示要生成与位置无关的代码,这是动态库的特性; -shared 是链接选项,告诉gcc要生成动态库而不是可执行文件。

上述的一行命令等同于:

gcc -c -fPIC max.c

gcc -shared -o libmax.so max.o

 

为动态库编写接口文件

让用户知道动态库中有哪些接口可用,需要编写对应的头文件

建立max.h

  1 #ifndef __MAX_H__

  2 #define __MAX_H__

  3

  4 int max(int n1, int n2, int n3);

  5

  6 #endif

 

 

测试,链接动态库生成可执行文件

建立一个使用 max 函数的 test.c , 代码如下

  1 #include <stdio.h>

  2 #include "max.h"

  3 int main(int argc, char *argv[])

  4 {

  5     int a = 10, b = -2, c = 100;

  6     printf("max among 10, -2 and 100 is %d.\n", max(a, b, c));

  7     return 0;

  8 }

 

生成test, 其中 -lmax 表示要链接 libmax.so。 -L. 表示要链接的库文件包含当前路径。(如果当前目录下有同名的动态库和静态库,gcc优先链接动态库)

gcc -o test test.c -lmax -L.

 

运行

此时直接运行 ./test 会得到如下错误:找不到libmax.so。

./test: error while loading shared libraries: libmax.so: cannot open shared object file: No such file or directory

因为 Linux 是通过 /etc/ld.so.cache 文件搜寻要链接的动态库。

而 /etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的。

此时有两种解决方式:

  1. 把 libmax.so 所在的路径添加到 /etc/ld.so.conf 中,再以root权限运行 ldconfig 程序,更新 /etc/ld.so.cache。test 运行时,就可以找到 libmax.so。(不推荐这种方式,改动系统的文件)
  2. 为 test 指定 LD_LIBRARY_PATH

LD_LIBRARY_PATH=. ./test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值