【问题标题】:gcc build links but shared library does not appear with lddgcc 构建链接,但共享库未与 ldd 一起出现
【发布时间】:2015-01-22 11:50:18
【问题描述】:

我有一个必须构建的程序。该程序依赖于libA,而libA 依赖于libB。两个库都在同一个文件夹中,但ldd libA.so 不包括libB.so,所以我必须在链接时添加它。

这是我的gcc 命令:

gcc -L/path/to/libraries/lib -lA -lB -I/path/to/libraries/include main.cpp

程序构建并链接,但没有启动。它给了我以下错误:

./a.out:符号查找错误:/path/to/libraries/lib/libA.so:未定义符号:symbol_used_in_libA_but_defined_in_libB

使用ldd 我可以看到libB.so 不包含在我的二进制文件中:

linux-vdso.so.1 =>  (0x00007fffaecd9000)
libA.so => /path/to/libraries/lib/libA.so (0x00007effc02a4000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007effbfebb000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007effbfca5000)
/lib64/ld-linux-x86-64.so.2 (0x00007effc05cb000)

我有这些条件:

  • /path/to/libraries 在里面 LD_LIBRARY_PATH
  • 运行ldconfig 没问题,ldconfig -p 找到libA.solibB.so
  • 如果在 gcc 命令中我将-lB 更改为-lBB,它会给我一个链接器错误,所以我认为gcc 可以正确找到libB.so,即使它没有在可执行文件中链接它。

我做错了什么?为了将可执行文件链接到这两个库,我可以做些什么?

【问题讨论】:

    标签: gcc linker ldd


    【解决方案1】:

    大多数 Linux 发行版(我假设您使用基于 ldd 输出的 Linux)似乎默认将 gcc 配置为将 --as-needed 传递给 ld(例如,对于 Debian,请参阅 here) .这意味着最终的库/可执行文件将仅依赖于一个库(即,该库有一个 DT_NEEDED 标记),如果该库的某个符号实际被库/可执行文件使用。

    在您的情况下,main.cpp 不使用libB 的任何功能,因此链接器不会添加libB 作为最终可执行文件的依赖项。您可以通过将--no-as-needed 标志传递给链接器来解决它。例如,

    gcc -Wl,--no-as-needed ...

    当然,正确的解决方法是重新链接 libA 并确保它将 libB 列为依赖项。

    【讨论】:

    • 这解决了我的问题,谢谢。我无法重建图书馆,因为它不是我的。无论如何,我必须检查,因为我同事电脑中具有相同库的相同命令可以代替..
    猜你喜欢
    • 2018-11-02
    • 2014-08-20
    • 1970-01-01
    • 2023-03-13
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多