编译提示cannot find -liberty错误如何安装对应依赖解决问题
编译报错 cannot find -liberty 解决方案
报错根因
/usr/bin/ld.gold: error: cannot find -liberty 属于链接阶段依赖缺失错误。
链接器的-l参数遵循固定匹配规则:传入-l<name>时,会自动搜索名为lib<name>.so的动态库或lib<name>.a的静态库。该报错里传入的参数是-liberty,实际要查找的是GNU libiberty库——很多人搜-liberty找不到相关内容,是因为误以为要找的库名是liberty,实际-l是链接参数前缀,后面跟的库名是iberty,对应库全名为libiberty.so。
分平台安装依赖
根据你使用的Linux发行版,执行对应命令安装libiberty的开发包即可:
- Debian/Ubuntu 及其衍生版(Deepin、Linux Mint、UOS等):
sudo apt update && sudo apt install binutils-dev libiberty-dev
- RHEL/CentOS/Fedora/Rocky/AlmaLinux 及其衍生版:
- CentOS7/RHEL7 版本:
sudo yum install binutils-devel- Fedora/CentOS8+/RHEL8+/Rocky8+/AlmaLinux8+ 版本:
sudo dnf install binutils-devel libiberty-devel - Arch Linux/Manjaro/EndeavourOS 等Arch系发行版:
sudo pacman -Syu binutils
Arch系的binutils包默认内置libiberty库,无需单独安装开发包。
安装后验证
执行以下命令检查库是否被系统链接器正确识别:
ldconfig -p | grep libiberty
如果输出包含libiberty.so的对应路径,说明依赖已经安装完成,重新执行编译即可。
特殊情况处理
如果装完依赖还是报错,按以下场景排查:
- 库存放在非标准路径:如果你之前手动编译安装过binutils到
/usr/local等自定义路径,系统默认链接器搜索路径不包含该目录,可在编译时添加-L<库存放路径>参数手动指定搜索路径,比如库在/usr/local/lib下就加-L/usr/local/lib;也可以将自定义库路径写入/etc/ld.so.conf.d/local.conf,执行sudo ldconfig刷新全局链接缓存。 - 仅存在静态库:部分发行版默认只提供静态版本的
libiberty.a,如果你的编译参数强制要求动态链接,可以自行编译binutils时添加--enable-shared编译选项生成动态版libiberty,再安装到系统库路径即可。
内容的提问来源于stack exchange,提问作者李兆龙
相关产品推荐
相关产品推荐

