动态库的制作与链接

目录

1、动态库的制作

1.1 编写库代码

1.2 编译源文件为目标文件

1.3 创建动态库

1.4 使用动态库(编译程序时候的链接)

1.5 动态库的版本控制

1.6 动态库的命名 

2、动态库的链接(运行时候的链接)

2.1 方法一:将动态库拷贝到系统默认路径

2.1.1 操作步骤

2.1.2 优缺点

2.2 方法二:通过 LD_LIBRARY_PATH 环境变量指定库路径

2.2.1 操作步骤

2.2.2 优缺点

2.3 方法三:将动态库路径添加到 .bashrc

2.3.1 操作步骤

2.3.2 优缺点

2.4 方法四:修改 /etc/ld.so.conf 配置文件并使用 ldconfig

2.4.1 操作步骤

2.4.2 优缺点


1、动态库的制作

1.1 编写库代码

        首先,你需要编写包含你想要打包成动态库的函数或类的源代码。例如,假设你要创建一个名为 mylib 的动态库,它包含一个简单的函数:

mylib.c

#include <stdio.h>

void hello() {
    printf("Hello, World!\n");
}

1.2 编译源文件为目标文件

gcc -c -fPIC mylib.c -o mylib.o
  •  -c 选项告诉编译器只进行编译,不进行链接。
  • -fPIC 选项表示生成与位置无关的代码(Position-Independent Code),这是创建动态库所必需的。

1.3 创建动态库

gcc -shared -o libmylib.so mylib.o
  •  -shared 选项告诉编译器创建一个共享库。
  • -o libmylib.so 指定输出文件名,通常动态库的文件名以 lib 开头,后缀为 .so

1.4 使用动态库(编译程序时候的链接)

        在编写程序时,你可以链接并使用这个动态库。假设有一个主程序 main.c:

#include "mylib.h"

int main() {
    hello();
    return 0;
}

 编译这个程序时,你需要指定动态库的路径和名称:

gcc main.c -L. -lmylib -o main
  •  -L. 指定链接器查找库的路径,. 表示当前目录。
  • -lmylib 告诉链接器链接 libmylib.so
  • 注:在此处 -L. 去指定查找路径只是在编译这个程序的时候,如果需要运行这个程序,实际上还需要本文 2、动态库链接 中的办法去指定运行的时候的查找路径

1.5 动态库的版本控制

gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0 mylib.o
ln -s libmylib.so.1.0 libmylib.so.1
ln -s libmylib.so.1 libmylib.so
  •  -Wl,-soname,libmylib.so.1 选项指定库的 soname,表示它的主版本号。
  • ln -s 命令创建符号链接,使得不同版本的库文件能够通过同一个名字访问。

1.6 动态库的命名 

一个完整的动态库文件名如 libmylib.so.1.0.3,可以拆分为以下几个部分:

  • lib:前缀,表示这是一个库文件。
  • mylib:库的名称,表示这是 C 标准库的一个版本。
  • .so:后缀,表示这是一个共享库文件。
  • .1:主版本号,指明了库接口的主要版本,通常与 soname 相关联。
  • .0.3:次版本号和修正号,用于标识较小的更新和修复。
  • 在实际使用中,系统会根据主版本号(soname)来决定加载哪个动态库版本,而不需要具体指定次版本号和修正号。这样,如果库进行了修正或小幅度升级,依赖这个库的程序可以无需重新编译而继续正常运行。

2、动态库的链接(运行时候的链接)

2.1 方法一:将动态库拷贝到系统默认路径

2.1.1 操作步骤

      将生成的动态库文件(如 libmylib.so)拷贝到系统默认的动态库路径,如 /lib/usr/lib 目录。

sudo cp libmylib.so /usr/lib/

2.1.2 优缺点

  • 优点

    • 系统范围可用:所有用户和程序都可以使用该动态库,无需额外配置。
    • 持久性:一旦拷贝,系统会永久识别该库,且不受环境变量设置的影响。
  • 缺点

    • 需要管理员权限:拷贝到系统目录通常需要管理员权限(sudo)。
    • 易引起冲突:如果库文件名与系统中其他库文件重名,可能会导致冲突。

2.2 方法二:通过 LD_LIBRARY_PATH 环境变量指定库路径

2.2.1 操作步骤

将动态库所在的目录添加到 LD_LIBRARY_PATH 环境变量中。例如,如果库在 /home/test 目录下,可以运行以下命令:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/test

2.2.2 优缺点

  • 优点

    • 灵活性高:可以在不同的终端或用户会话中灵活设置不同的库路径。
    • 无需管理员权限:用户可以自行设置,无需修改系统配置或拷贝文件。
  • 缺点

    • 仅在当前终端有效:环境变量的设置只在当前终端或会话中有效,关闭终端后失效。
    • 需要每次手动设置:如果没有将其添加到配置文件(如 .bashrc),每次启动新终端时都需要重新设置。

2.3 方法三:将动态库路径添加到 .bashrc

2.3.1 操作步骤

打开配置文件

vim ~/.bashr

 在文件末尾添加一行,将动态库路径添加到 LD_LIBRARY_PATH 变量。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/test

 要使更改立即生效,可以运行以下命令

source ~/.bashrc

2.3.2 优缺点

  • 优点

    • 持久性:路径设置永久有效,所有新启动的终端都会自动应用这个配置。
    • 无需每次手动设置:用户无需在每次打开终端时手动设置 LD_LIBRARY_PATH
  • 缺点

    • 仅对当前用户有效:该设置仅对当前用户有效,其他用户的环境不会受到影响。如果需要系统范围的设置,仍然需要使用其他的方法(如修改 /etc/ld.so.conf)。
    • 需要注意环境变量的管理:过多或不正确的路径设置可能会影响系统的正常运行。

2.4 方法四:修改 /etc/ld.so.conf 配置文件并使用 ldconfig

2.4.1 操作步骤

编辑 /etc/ld.so.conf 文件,添加动态库所在的路径。

sudo vim /etc/ld.so.conf

 保存并退出后,运行 ldconfig 命令更新系统的库缓存:

sudo ldconfig

2.4.2 优缺点

  • 优点

    • 全局有效:系统范围内的所有用户和程序都可以识别这个库路径。
    • 持久性:路径设置持久有效,即使重启系统也不受影响。
  • 缺点

    • 需要管理员权限:修改 /etc/ld.so.conf 文件和运行 ldconfig 命令需要管理员权限。
    • 需谨慎管理:错误地添加路径可能会导致系统查找库时发生问题。
  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值