树莓派4(aarch64)交叉编译链接失败求助:找不到crt1.o/crti.o
解决树莓派4 64位交叉编译中crt1.o/crti.o找不到的链接错误
问题概述
在Ubuntu 20.04上使用CMake交叉编译树莓派4(64位Bullseye镜像)时,链接阶段出现crt1.o和crti.o找不到的错误,尽管这些文件已存在于sysroot的usr/lib/aarch64-linux-gnu/目录下,且工具链与sysroot的架构、glibc版本匹配。
解决方案
1. 修复sysroot的符号链接与完整性
直接复制树莓派系统文件时,容易丢失符号链接或导致路径错误,执行以下步骤修复:
- 确保复制sysroot时使用
cp -a保留符号链接和文件属性:# 重新从树莓派复制sysroot示例(替换为你的树莓派IP) scp -r pi@<树莓派IP>:/lib/ $RPI_SYSROOT/ scp -r pi@<树莓派IP>:/usr/lib/ $RPI_SYSROOT/usr/ scp -r pi@<树莓派IP>:/usr/include/ $RPI_SYSROOT/usr/ - 修复sysroot内的符号链接,将绝对路径转换为相对路径:
cd $RPI_SYSROOT sudo find . -type l -exec sh -c ' target=$(readlink "{}") if [[ $target == /* ]]; then ln -sf "${target#/}" "{}" fi ' \; - 确认
$RPI_SYSROOT/lib/aarch64-linux-gnu/下存在指向../usr/lib/aarch64-linux-gnu/crt1.o和crti.o的符号链接。
2. 简化CMake工具链配置
手动设置链接命令会破坏CMake的默认sysroot处理逻辑,替换工具链文件为以下精简版本:
# CMake Toolchain file for crosscompiling to Raspberry Pi 4 64-bit set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64) set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_SYSROOT $ENV{RPI_SYSROOT}) # 指定交叉编译工具 set(CMAKE_C_COMPILER $ENV{RPI_TOOLCHAIN}aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER $ENV{RPI_TOOLCHAIN}aarch64-linux-gnu-g++) set(CMAKE_AR $ENV{RPI_TOOLCHAIN}aarch64-linux-gnu-ar) set(CMAKE_ASM_COMPILER $ENV{RPI_TOOLCHAIN}aarch64-linux-gnu-as) set(CMAKE_OBJCOPY $ENV{RPI_TOOLCHAIN}aarch64-linux-gnu-objcopy) set(CMAKE_RANLIB $ENV{RPI_TOOLCHAIN}aarch64-linux-gnu-ranlib) set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu) set(CMAKE_C_COMPILER_TARGET aarch64-linux-gnu) set(CMAKE_CXX_COMPILER_TARGET aarch64-linux-gnu) add_compile_options(-pthread) # 添加正确的rpath-link参数 add_link_options(-Wl,-rpath-link=$ENV{RPI_SYSROOT}/lib/aarch64-linux-gnu) add_link_options(-Wl,-rpath-link=$ENV{RPI_SYSROOT}/usr/lib/aarch64-linux-gnu) set(CMAKE_FIND_ROOT_PATH $ENV{RPI_SYSROOT}) # 调整查找路径规则 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
3. 验证工具链与sysroot的路径识别
执行以下命令检查工具链是否正确识别sysroot路径:
$RPI_TOOLCHAIN/aarch64-linux-gnu-gcc --sysroot=$RPI_SYSROOT -print-search-dirs
查看输出的libraries部分,确认包含$RPI_SYSROOT/usr/lib/aarch64-linux-gnu等关键路径。
4. 清理并重新构建
删除现有构建目录,重新加载环境变量后执行CMake配置:
rm -rf build && mkdir build && cd build source <你的环境变量脚本路径> cmake .. -DCMAKE_TOOLCHAIN_FILE=<你的工具链文件路径> make
内容的提问来源于stack exchange,提问作者nicoh
相关产品推荐
相关产品推荐

