gcc生成链接,但共享库未与ldd一起显示

gcc生成链接,但共享库未与ldd一起显示,gcc,linker,ldd,Gcc,Linker,Ldd,我有一个我必须建立的程序。程序依赖于libA,而libA依赖于libB。两个库都在同一个文件夹中,但是ldd libA。因此不包括libB。因此必须在链接它时添加它 这是我的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:u

我有一个我必须建立的程序。程序依赖于
libA
,而
libA
依赖于
libB
。两个库都在同一个文件夹中,但是
ldd libA。因此
不包括
libB。因此
必须在链接它时添加它

这是我的
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在libA中使用,但在libB中定义

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

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\u LIBRARY\u path
  • 运行
    ldconfig
    正常,并且
    ldconfig-p
    查找
    libA.so
    libB.so
  • 如果在gcc命令中,我用
    -lBB
    更改
    -lB
    ,它会给我一个链接器错误,因此我认为
    gcc
    可以正确地找到
    libB。因此
    即使它没有在可执行文件中链接它
我做错了什么?为了将可执行文件链接到这两个库,我能做些什么?

大多数Linux发行版(我假设您使用的是基于
ldd
输出的Linux)似乎配置了
gcc
,以便在默认情况下将
--根据需要
传递到
ld
(例如,请参阅Debian)。这意味着,如果库/可执行文件实际使用了某个库的符号,则最终的库/可执行文件将仅取决于该库(即,该库具有
dtu-NEEDED
标记)

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

gcc-Wl,--根据需要,无


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

这解决了我的问题,谢谢。我不能重建图书馆,因为它不是我的。无论如何,我必须检查一下,因为在我同事的电脑中,相同的命令和相同的库起作用。。