我正在使用一台虚拟机 (CentOS 5.3),该虚拟机的主驱动器上的存储空间非常小(包括/usr
、/usr/local
等)。大多数存储空间在安装到 的单独驱动器上可用/mnt
。因此,在这个驱动器上,我创建了一个基本安装目录(带有bin
、include
、lib
等子目录)并在那里安装了一个库。
[standage@vm142-46 ~]$ ls -lhp /mnt/lib
total 33M
-rw-r--r-- 1 standage iplant-everyone 21M Dec 21 16:29 libgenometools.a
-rwxr-xr-x 1 standage iplant-everyone 13M Dec 21 16:29 libgenometools.so
然后,我尝试使用我编写的代码链接到该库,但它给了我以下消息。
/usr/bin/ld: cannot find -lgenometools
我意识到我没有更新ldconfig
我创建的新安装目录,所以我继续添加/mnt/lib
并/etc/ld.so.conf
运行/sbin/ldconfig
.然而,当我尝试再次链接我的代码时,我得到了同样的错误。
我最终能够通过创建符号链接来链接库/usr/local/lib64
......
[standage@vm142-46 ~]$ sudo ln -s /mnt/lib/libgenometools.a /usr/local/lib64
[standage@vm142-46 ~]$ sudo ln -s /mnt/lib/libgenometools.so /usr/local/lib64
...但这并没有真正解决我原来的问题,它只是一个管道胶带解决方案。我最初做错了什么以及如何链接到我已安装的库?
答案1
/etc/ld.so.conf
只影响动态链接器,即运行时查找库的位置。当您构建可执行文件时,重要的是ld
查找库的路径。指定这些的通常方法是传递选项-L
;大多数configure
脚本都有一种传递附加-L
选项的方法。通常没有办法更改 的默认搜索路径ld
。您可能会考虑更改 gcc 规范文件,但这将涉及更改 下的文件/usr
,而不是/etc
.
鉴于您的设置有点尴尬,您可能需要研究一下联合安装以上。/mnt
/usr
我不知道 CentOS 是否提供了联合挂载的可能性(当然,还有第三方选项,本机的或基于 FUSE 的)。
答案2
您可以使用ldconfig -v
ldconfig 来查看是否知道新库。我假装,该消息/usr/bin/ld: cannot find -lgenometools
是在编译程序的链接阶段,不是吗?然后你必须告诉链接器,它可能会使用-L/mnt/lib
参数找到一个库。