如何将用户编译的共享库的共享库链接到 Debian 上的 c++ 应用程序

How do you link a shared library of a user-compiled shared library to a c++ application on Debian?

本文关键字:共享 Debian 上的 c++ 应用程序 链接 编译 用户      更新时间:2023-10-16

假设您有一个共享库 A.so,并且另一个共享库 B.so 是根据 A.so 编译的。换句话说,

ldd B.so

提到 A.so。此外,假设 A.so 和 B.so 已经由我自己成功编译,即它们位于我的主目录中的某个地方。

现在,我有一个应用程序应用程序,我想针对 A.so 和 B.so 进行编译。由于 A.so 包含在 B.so 中,因此我只想针对 B.so 进行链接。

所以,我在两个不同的Linux系统下这样做了。我在SLES 10 SP2和Debian 7.7.0上尝试过(基本安装,在该系统上没有什么特别的)。在 SLES 10 SP2 上,这绝对没有问题。在 Debian 上,我收到如下消息:

/usr/bin/ld: /tmp/ccjQFzpo.o: undefined reference to symbol '_ZN2sf7secondsEf'
A.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

例如,A.so 可以是我自己编译的Qt4库。如果我使用 apt-get 安装安装 Qt4 库,那么它可以工作。

我试图将 A.so 和 B.so 添加到给出的列表中

ldconfig -v

即我已经能够在此列表中看到它们。它不能解决问题。

我错过了什么?

由于 A.so 包含在 B.so 中,因此我只想针对 B.so 进行链接。

这是误解,共享库在链接时不包含在另一个库或应用程序中,它们是动态加载的。动态库与静态库的全部目的。它以前对你有用,因为链接器自动加载了所有依赖的库。

对于debian我相信,自从wheezy他们更改了 DSO 链接策略 - 依赖的共享库不会自动链接,您必须在链接应用程序时列出所有这些库(在您的情况下,您必须明确说 A.so 和 B.so)。详情请点击此处 https://wiki.debian.org/ToolChain/DSOLinking