根据第三方库链接到库

我正在创建一个依赖于其他库( libpnglibX11等)的库。 我想知道是否有可能(例如某些标志)用户二进制文件不能直接链接到第三方库,而是通过我的lib间接链接。

这是一个例子:

libb.c (作为第三方库)

 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链接。 但我不希望最终用户必须链接所有库,因为它很麻烦,并且可能在将来发生变化。 是否有可能避免这种情况?

我认为你问的是动态库,而不是静态库(根据大多数评论)。

如果是的话,是的,这是可能的。

假设您有一个名为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 ,它使用的库是正确链接的。我倾向于libtool