gpt4 book ai didi

c++ - 链接到依赖于第三方库的库

转载 作者:行者123 更新时间:2023-11-30 19:44:27 24 4
gpt4 key购买 nike

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

这是一个例子:

libb.c(作为第三方库)

int get21()
{ return 21; }

liba.c (作为我的库)

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

通常,我也需要将 main 与 -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 为此。

关于c++ - 链接到依赖于第三方库的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28157228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com