/usr/lib/ld; cannot find -lxxxx

铺垫

今天逛知乎,发现一款小工具叫FZF.于是特意查了一下据说速度是Find的2**n,评价还不错,但毕竟不是亲身体验,不敢乱说,就想亲自体验一把在评价,结果问题来了.因为我是Arch用户习惯了在AUR上拽包安装,当然也可以从Github上clone下来安装.

错误出现

当编译安装包时出现了下面的错误:

1
2
3
4
5
6
->building...
# github.com/junegunn/fzf/src/curses
/usr/lib/ld: cannot find -lncursesw
collect2:错误: ld 返回 1
==>错误: 在build()中发生一个错误.
正在放弃...........

上面的错误重点在

1
/usr/lib/ld: cannot find -lncursesw

错误分析

原因可能有以下几种:

  • 缺少对应的库
  • 未能正确链接对应的库
  • 库的路径问题

解决方案

缺少对应的库

对于这个错误,解决方法比较直接.只需将缺少的库安装上就好了,但是在安装之前先检查一下该库是否尚未安装.即执行:

1
2
$ cd /usr/lib        //进入存放库的目录
$ ls -l libxxxx*

其中xxxx是报错时的库我的是ncursesw,如果存在libxxxx.so或libxxxx.so.x等前面是libxxxx的字样请跳到 <未能正确链接对应的库>.如果不存在就安装相应的库,对于Arch用户在AUR里基本上可以找到你需要的库.

未能正确链接对应的库

如果/usr/lib/里含有该库还是报错,那可能就是链接问题.例如对于我的错误来说,我的/usr/lib/里含有libncursesw.so.6和libncursesw.so.6.0文件但是它还是报错,这种情况下只需进行一次链接操作就解决问题了:

1
$ sudo ln -s libncursesw.so.6 libncursesw.so

如果安装时还有错,请继续往下看.

库的路径问题

在/usr/lib/目录下大部分都是动态链接库(即*.so*文件)为了让系统共享动态链接库,就需要ld.so.conf,ld.so.cache,以及ld.so.conf.d目录下的配置文件来进行索引(这些文件在/etc目录下),所以对于路径问题只需在ld.so.conf.d目录下新建一个.conf文件,将libxxxx所在的路径写进去就行了,关于格式可以参考该目录下的其他.conf文件.因为我的libncursesw.so在/usr/lib目录下(一般的库都在这),所以在/etc/ld.so.conf.d/目录下新建文件lib.conf,内容如下:

1
/usr/lib    //仅此一句

最后要对新的配置文件进行更新,以root身份执行:

1
$ ldconfig

End

最后体验了一把FZF,真心比Find 好用,感动哭了都.