Ubuntu20.04编译cpabe 0.11报DSO missing from command line错误求助
报错原因
该报错由GCC链接顺序错误导致。Ubuntu 20.04默认搭载的GCC 9版本默认开启--as-needed链接校验规则,要求库的链接顺序必须严格满足「依赖其他库的上层库排在前,被依赖的底层基础库排在后」的要求。
你当前的编译链接命令中,-lpbc(PBC库)排在-lgmp(GMP库)之前,但PBC库本身的运行依赖GMP库提供的函数,报错里提到的__gmpz_clear就是GMP库的导出符号,链接器扫描到PBC库的未定义符号时,还未处理到后续的GMP库,就会抛出DSO缺失、符号未定义的错误。
解决步骤
- 进入cpabe源码根目录,先备份原有Makefile避免修改出错无法恢复:
cp Makefile Makefile.bak - 打开Makefile文件,找到配置链接参数的行(一般是
LDFLAGS字段或者直接写在编译目标规则里),将原有链接库的顺序调整为:-O3 -Wall -lglib-2.0 -Wl,-rpath /usr/local/lib -lpbc -lbswabe -lgmp -lcrypto
顺序规则参考:越上层的业务依赖库越靠前,越底层的基础依赖库越靠后。依赖链为cpabe -> libbswabe -> libpbc -> libgmp,同时cpabe、libbswabe还依赖glib、openssl crypto库,因此基础库gmp、crypto放在链接参数的最后即可。
- 清理之前失败编译生成的中间文件:
make clean - 重新执行编译命令:
make - 编译无报错后,执行安装命令将二进制文件部署到系统路径:
sudo make install
安装验证
安装完成后在终端执行cpabe-setup --help,如果能正常输出命令帮助信息,说明编译安装成功。
内容的提问来源于stack exchange,提问作者Kaushik Dey
相关产品推荐
相关产品推荐

