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

时间:2015-01-08 18:37:23

标签: c++ debian shared-libraries

假设您有一个共享库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 install安装Qt4库,那么它可以工作。

我尝试将A.so和B.so添加到

给出的列表中
ldconfig -v

即。我已经能够在这个列表中看到它们。它没有解决问题。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

  

因为A.so包含在B.so中,我只想链接B.so.

这是误解,共享库在链接时未包含在另一个库或应用程序中,它们是动态加载的。这是动态库与静态库的整体目的。它之前适用于您,因为链接器会自动加载所有依赖的库。

对于debian我认为自wheezy他们更改了DSO关联策略后,依赖的共享库不会自动链接,您必须在链接应用时列出所有这些(在您的情况下,必须明确地说A.so和B.so)。详情请见https://wiki.debian.org/ToolChain/DSOLinking