根据第三方库链接到库
我正在创建一个依赖于其他库( libpng
, libX11
等)的库。 我想知道是否有可能(例如某些标志)用户二进制文件不能直接链接到第三方库,而是通过我的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
。