链接没有soname的第三方共享库,链接器名称

3
在Debian Squeeze上安装liboost-dev会给我提供几个库,例如/usr/lib/libboost_thread.so.1.42.0,但没有libboost_thread.so。现在我无法使用gcc / ld的-l标志进行链接,因为名称不以.so结尾。
我注意到/usr/lib有很多其他形式的库,如libfoo.so.N,没有libfoo.so,所以这不是Boost特有的问题。最终,我手动添加了libboost_thread.so.1和libboost_thread.so符号链接。(ldconfig的man页面建议它会添加链接,但它什么也没做)。
一切都正常工作,但感觉有点不可靠。我应该怎么做呢?
- 使用一些我还没有找到的更具体的链接器选项(以特定版本号为代价,使我的makefile依赖于它)。 - 只需手动添加符号链接(存在破坏软件包管理的风险)。 - 其他Debian“正确”的方法。

如果这个问题看起来很熟悉,那是因为我几周前问过类似的问题,但被认为不符合主题而删除了。后来我又改变了主意,但发现需要+10k的声望才能恢复自己删除的帖子。 - fizzer
2个回答

2
您安装了运行时包libboost-thread1.42.0,但是缺少开发包libboost-thread-dev(或者通用的libboost-all-dev包),因此需要安装相应的-dev包才能进行链接。这是大多数Linux发行版的一个通用特性---您几乎永远不需要手动操作符号链接。
edd@max:~$ ls -l /usr/lib/libboost_thread.*
-rw-r--r-- 1 root root 176324 2010-10-21 00:56 /usr/lib/libboost_thread.a
lrwxrwxrwx 1 root root     25 2011-05-14 10:17 /usr/lib/libboost_thread.so -> \
                                                        libboost_thread.so.1.42.0
-rw-r--r-- 1 root root  88824 2010-10-21 00:56 /usr/lib/libboost_thread.so.1.42.0
edd@max:~$ dpkg -S /usr/lib/libboost_thread.so
libboost-thread1.42-dev: /usr/lib/libboost_thread.so
edd@max:~$ 

显然,软件包管理系统创建了这些链接并拥有它们。

如上所述,我安装了libboost-dev。'dpkg --get-selections | grep boost'显示libboost-dev和libboost1.42-dev。一切都正确(包括在/usr/include中的头文件),除了符号链接。 - fizzer
看到你的问题编辑了--我建议清除那两个软件包并重新安装它们。 - Dirk Eddelbuettel
好的 - 我安装了libboost-all-dev,这样就放置了正确的符号链接。非常感谢。我猜测libboost-dev有问题。 - fizzer
你知道吗,可能是因为libboost-dev版本过旧,所以你需要安装libboost-thread1.42-dev,它会通过libboost-all-dev自动引入。关于需要运行时包的开发包的一般规则仍然适用。很高兴知道你现在已经可以正常运行了。 - Dirk Eddelbuettel

0

Dirk的答案就一般原则而言是正确的,但是boost打包方面似乎有一个额外的陷阱。

通常,头文件和库符号链接在同一个软件包中,因此您不用考虑即可获得库符号链接。然而,在boost中,“libboost<version>-dev”提供了头文件,但是“libboost-<lib><version>-dev”提供共享库符号链接。因此,如果您仅安装前者,则可以编译但无法链接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接