作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个依赖于其他库(libpng
、libX11
等)的库。我想知道用户二进制文件是否有可能(例如,使用一些标志)不直接链接到第三方库,而是通过我的库间接链接。
这是一个例子:
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/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!