我正在创建一个依赖于其他库(libpng
,libX11
等)的库。我想知道是否有可能(例如某些标志)用户二进制文件不能直接链接到第三方库,而是通过我的lib间接链接。
以下是一个例子:
libb.c
(作为第三方lib)int get21()
{ return 21; }
liba.c
(作为我的lib)int get21();
int get42()
{ return get21() * 2; }
main.c
(作为用户代码)int get21();
int get42();
int main()
{
printf("42 = %d\n21 = %d\n", get42(), get21());
return 0;
}
$ gcc -fPIC -shared libb.c -o libb.so
$ gcc -fPIC -shared liba.c -L. -lb -Wl,-rpath=. -o liba.so
$ gcc main.c -L. -la -Wl,-rpath=.
/usr/bin/ld: /tmp/ccVm8exQ.o: undefined reference to symbol 'get21'
./libb.so: error adding symbols: DSO missing from command line
通常,我还需要将主要链接到-lb
。但我不希望最终用户必须链接所有库,因为它很麻烦,将来可能会改变。是否有可能避免这种情况?
答案 0 :(得分:0)
我认为你在询问动态库,而不是静态库(根据大多数评论)。
如果是的话,是的,这是可能的。
假设您有一个名为A的动态库(.so
),它又使用其他动态链接库B和C.希望使用库A的二进制X只需要链接到库A和库B和C将被自动拉入。请注意,X需要明确链接到B或C(并包括它们的头文件),以便X直接使用B或C中的任何内容(而不是通过A)。
这是一个实例。正如您所看到的xml2-config
所说,链接到libxml2
的正确方法仅仅是使用-lxml2
。但是,ldd
表明它依次链接到各种其他库,包括liblzma
(例如)。使用libxml2
的程序无需在链接行上指定-llzma
,除非它直接使用liblzma
。
$ xml2-config --libs
-lxml2
$ ldd /usr/lib/x86_64-linux-gnu/libxml2.so
linux-vdso.so.1 => (0x00007fff157c9000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7c51805000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7c515ec000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f7c513c9000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7c510c3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7c50cfd000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7c51d93000)
如果您要求 如何执行此操作,我发现的关键是说服ldd
它使用的库已正确链接。我倾向于{{1为此。