2015-01-08 64 views
0

假设你有一个共享库A.so,而另一个共享库B.so是按照A.so编译的。换句话说,如何将用户编译的共享库的共享库链接到Debian上的C++应用程序?

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

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

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

对于debian我相信,因为wheezy他们改变了DSO链接政策 - 依赖共享库不会自动链接,你有当您链接您的应用程序(在你的情况下,你必须明确地说A.so列出所有的人和B.so)。详细信息可以在这里找到https://wiki.debian.org/ToolChain/DSOLinking

+0

那么,那么如何安装Qt,例如,与突触,解决了我的问题(对于特定的库)?我的意思是,如果A.so是libQtCore.so,并且我用突触安装了Qt,那么我只需要链接B.so.我没有收到DSO错误消息。 –