根据第三方库链接到库

时间:2015-01-26 19:23:09

标签: c++ c gcc

我正在创建一个依赖于其他库(libpnglibX11等)的库。我想知道是否有可能(例如某些标志)用户二进制文件不能直接链接到第三方库,而是通过我的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。但我不希望最终用户必须链接所有库,因为它很麻烦,将来可能会改变。是否有可能避免这种情况?

1 个答案:

答案 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为此。