目录
2.2 方法二:通过 LD_LIBRARY_PATH 环境变量指定库路径
2.4 方法四:修改 /etc/ld.so.conf 配置文件并使用 ldconfig
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
命令需要管理员权限。- 需谨慎管理:错误地添加路径可能会导致系统查找库时发生问题。