16.5. 在 GCC 中使用动态库
动态库以独立可执行文件的形式提供,在链接时间和运行时都是必需的。它们与您的应用程序的可执行文件保持独立。
先决条件
- GCC 已安装在系统上
- 组成有效程序的一组源或对象文件,需要一些动态库 foo,且没有其他库
- foo 库作为一个文件 libfoo.so
链接程序 Against 是一个动态库
根据动态库 foo 关联程序:
$ gcc ... -Llibrary_path -lfoo ...
当程序与动态库链接时,生成的程序必须在运行时始终加载库。查找库有两个选项:
-
使用存储在可执行文件本身中的
rpath
值 -
在运行时使用
LD_LIBRARY_PATH
变量
使用存储在可执行文件中的 rpath
值
rpath
是一个特殊值,在链接文件时保存为可执行文件的一部分。之后,从可执行文件加载程序时,运行时链接器将使用 rpath
值来查找库文件。
使用 GCC 链接时,将路径 library_path 保存为 rpath
:
$ gcc ... -Llibrary_path -lfoo -Wl,-rpath=library_path ...
路径 library_path 必须指向包含文件 libfoo.so 的目录。
在 -Wl,-rpath=
选项中逗号后没有空格
要稍后运行程序,请执行:
$ ./program
使用 LD_LIBRARY_PATH 环境变量
如果在程序的可执行文件中没有找到 rpath
,则运行时链接器将使用 LD_LIBRARY_PATH
环境变量。必须根据共享库对象所在路径更改每个程序的值。
要运行没有设置 rpath
的程序,且 library_path 中存在库,请执行:
$ export LD_LIBRARY_PATH=library_path:$LD_LIBRARY_PATH
$ ./program
省略 rpath
值可提供灵活性,但每次程序运行时,需要设置 LD_LIBRARY_PATH
变量。
将库放入默认目录
运行时链接器配置指定多个目录作为动态库文件的默认位置。要使用此默认情况,请将您的库复制到适当的目录中。
有关动态链路器行为的完整描述超出了本文档的范围。如需更多信息,请参阅以下资源:
动态链接器的 Linux 手册页:
$ man ld.so
/etc/ld.so.conf
配置文件的内容:$ cat /etc/ld.so.conf
由动态链路器识别的库报告,无需额外配置,其中包括目录:
$ ldconfig -v