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
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.