You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:17:05