解决链接时无法被用于生成共享目标问题

出现以下报错:
/usr/bin/ld: ../3rdparty/libsndfile/Linux/aarch64/libsndfile.a(libsndfile_la-sndfile.o): relocation R_AARCH64_ADR_PREL_PG_HI21 against symbol `stderr@@GLIBC_2.17' which may bind externally can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: ../3rdparty/libsndfile/Linux/aarch64/libsndfile.a(libsndfile_la-sndfile.o)(.text+0x3b4): unresolvable R_AARCH64_ADR_PREL_PG_HI21 relocation against symbol `stderr@@GLIBC_2.17'
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/test_car.dir/build.make:253: test_car] Error 1
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/test_car.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

该错误表明,静态库 libsndfile.a 中的对象文件未使用 -fPIC 编译,导致在链接时无法被用于生成共享目标或位置无关代码 

可行的解决方案

方法 1: 重新构建支持 -fPIC 的静态库

如果可以找到 libsndfile.a 的编译来源,建议重新编译该库,添加 -fPIC 选项。

方法 2: 将静态库打包为动态库

如果不能重新编译,可以将静态库封装为动态库,这通常可以绕过 -fPIC 问题。

临时解决方法

仅供调试使用:

  1. 跳过静态库的 PIC 检查: 修改链接选项,添加 -no-pie(不推荐,仅用于快速测试):

    target_link_libraries(test PRIVATE -no-pie ${LIBSNDFILE_PATH}/libsndfile.a)

  2. 如果链接通过,则说明问题来源于链接器对 -fPIC 的限制。但这种方法可能会导致程序在加载时出现运行时错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值