gpt4 book ai didi

gcc构建链接,但共享库未与ldd一起出现

转载 作者:行者123 更新时间:2023-12-04 06:18:09 25 4
gpt4 key购买 nike

我有一个必须构建的程序。该程序取决于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: symbol lookup error: /path/to/libraries/lib/libA.so: undefined symbol: 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/librariesLD_LIBRARY_PATH
  • 可以运行 ldconfig
  • 正常,而ldconfig -p可以同时找到libA.solibB.so
  • 如果在gcc命令中用-lB更改-lBB,它会给我一个链接器错误,因此,我认为gcc可以正确找到libB.so,即使它未在可执行文件中链接它。

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

    最佳答案

    大多数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列为依赖项。

    关于gcc构建链接,但共享库未与ldd一起出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28088100/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com