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
列为依赖项。这解决了我的问题,谢谢。我不能重建图书馆,因为它不是我的。无论如何,我必须检查一下,因为在我同事的电脑中,相同的命令和相同的库起作用。。