【问题标题】:C++ shared librariesC++ 共享库
【发布时间】:2010-05-15 02:42:58
【问题描述】:

我试图了解共享库在 c++ unix 环境中的工作方式。我知道在编译代码时我们只需要头文件而不需要共享库规范。但是如果我想从我的编译文件创建一个可执行或共享库,我是否需要指定共享库依赖项(那些是动态的)?并且共享库的路径是否需要与运行时加载时的路径相匹配?

我正在使用 Linux 2.6.18-164.11.1.el5 #1 SMP x86_64 GNU/Linux

我的代码无法在运行时获取库时遇到问题。我试过设置 LD_LIBRARY_PATH 和 PATH。但是在运行时,当我运行可执行文件时,出现以下错误: 错误:librc.so:无法打开共享对象文件:没有这样的文件或目录

山姆

【问题讨论】:

  • 您能否详细说明您的实际问题?
  • 您可能还想说明您正在使用哪种版本的 unix 和什么版本的编译器。

标签: c++


【解决方案1】:

标头仅用于编译阶段。在链接时,您通常必须指定要链接到的共享库。您可能会看到 -L 选项来设置共享库所在的位置,和/或 -l 来指定要链接的库。命令行上通常还有一个开关,用于提醒链接器您使用的是线程安全版本的库还是“常规”库,以及另一个用于指定动态链接的开关。

在运行时,无论您是启动使用库的程序,还是运行 ldd 以找出它需要什么,操作系统都有一个用于定位 .so 文件的系统,这可能因一个 unix 版本而异。 LD_LIBRARY_PATH 变量指定在哪里查找 .so 文件,但可能不是完整的故事,具体取决于所讨论的确切 unix 版本。此外,您可能不想修改 LD_LIBRARY_PATH ,除非从一次性外壳中修改,因为它具有系统范围的效果。更好的选择是检查“缺失”的 .so 文件是否在 LD_LIBRARY_PATH 设置的现有路径上,如果没有,请尝试将它们的副本放在该路径的某个位置。

【讨论】:

  • 我在链接过程中包含了动态库。当我在共享库上运行 ldd 时,我得到: libboost_date_time.so.1.40.0 => not found libriskcontrol.so => not found libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b9d8170c000) libc。 so.6 => /lib64/libc.so.6 (0x00002b9d8191b000) 我在使用 -L 和 -l 链接时明确指定了库
  • 在哪个 Unix 变体下搜索动态对象的 $PATH 目录?
  • @AProgrammer - 抱歉,也许我搞混了,因为我今天无法访问我常用的系统。无论如何,有一些标准的方式来定位 .so 文件(除了 LD_LIBRARY_PATH),我会尽快纠正这个问题。
  • 我已经尝试设置所有 PATH、LD_LIBRARY_PATH 等。但由于某种原因,它仍然抱怨在运行时找不到库。
【解决方案2】:

在运行时,搜索动态库:

  • 在可执行文件中记录的路径中(在链接时使用 -rpath 的 linux 下,在带有 -R 的 Solaris 下,在目录名称中使用 $ORIGIN 允许指定相对于包含可执行文件的目录的目录)

  • 在 LD_LIBRARY_PATH 中(或等效的,有时有 64/32 位变体)。如果路径已记录在可执行文件中,则可能不会搜索 LD_LIBRARY_PATH(在 Linux 下,如果可执行文件已使用选项 --enable-new-dtags 链接,则会在记录的路径后搜索;我暂时不记得 Solaris 行为)

  • 在一组系统相关目录中(Linux 允许在 /etc/ld.so.conf 中指定它们并有缓存,请参阅 ldconfig)

【讨论】:

    猜你喜欢
    • 2017-10-21
    • 1970-01-01
    • 2012-04-24
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多