假设您有一个共享库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
即。我已经能够在这个列表中看到它们。它没有解决问题。
我错过了什么?
答案 0 :(得分:1)
因为A.so包含在B.so中,我只想链接B.so.
这是误解,共享库在链接时未包含在另一个库或应用程序中,它们是动态加载的。这是动态库与静态库的整体目的。它之前适用于您,因为链接器会自动加载所有依赖的库。
对于debian
我认为自wheezy
他们更改了DSO关联策略后,依赖的共享库不会自动链接,您必须在链接应用时列出所有这些(在您的情况下,必须明确地说A.so和B.so)。详情请见https://wiki.debian.org/ToolChain/DSOLinking