使用预编译librav1e出现libc.so加载及链接错误的技术求助
解决方法
1. 问题根源
预编译的librav1e是在更高版本glibc的系统(如Ubuntu 20.04及以上)编译的,这类系统的libc.so可能是实际共享库,或者编译时的链接配置导致它直接依赖libc.so而非标准的libc.so.6。而Ubuntu 18.04的libc.so是ld脚本,链接器无法直接用它解析符号;再加上fstat64/stat64这类函数在旧glibc中的符号定义与新系统存在差异,最终触发错误。
2. 临时修复:添加链接器参数
编译依赖librav1e的代码时,给链接器添加以下参数,强制它使用正确的libc库:
# 在编译命令中注入这些LDFLAGS export LDFLAGS="-Wl,-rpath-link=/lib/aarch64-linux-gnu -Wl,--undefined-version" # 之后正常执行你的编译命令,比如: # make
参数说明:
-rpath-link=/lib/aarch64-linux-gnu:告诉链接器到指定目录查找libc.so.6,替代找不到的libc.so--undefined-version:忽略版本符号不匹配的问题,规避高版本glibc编译的库带来的版本符号差异
3. 彻底解决:从源码编译librav1e
预编译包的兼容性问题很难彻底规避,直接在Ubuntu 18.04 aarch64环境下编译librav1e是最稳妥的方案:
# 安装编译依赖 sudo apt update && sudo apt install cargo build-essential git # 克隆源码并切换到v0.6.6版本 git clone https://github.com/xiph/rav1e.git cd rav1e git checkout v0.6.6 # 编译release版本 cargo build --release # 安装库文件和头文件 sudo cp target/release/librav1e.so* /usr/local/lib/ sudo cp target/release/librav1e.a /usr/local/lib/ sudo cp -r include/rav1e /usr/local/include/ # 生成并安装pkgconfig配置文件(供依赖库自动查找) sudo mkdir -p /usr/local/lib/pkgconfig/ cat > /usr/local/lib/pkgconfig/rav1e.pc <<EOF prefix=/usr/local exec_prefix=\${prefix} libdir=\${exec_prefix}/lib includedir=\${prefix}/include Name: rav1e Description: AV1 encoder library Version: 0.6.6 Libs: -L\${libdir} -lrav1e Cflags: -I\${includedir} EOF
4. 关于libc依赖的疑问
这种依赖libc.so的情况不正常,标准Linux共享库应该依赖libc.so.6(动态库的SONAME)。预编译包出现这个问题是编译环境的链接配置导致的,属于兼容性bug。
内容的提问来源于stack exchange,提问作者homm
相关产品推荐
相关产品推荐

