RPI aarch64交叉编译:无法链接

问题描述 投票:0回答:1

我正在尝试使用 Ubuntu 20.04 中的 cmake 交叉编译树莓派 4(64 位)。 我使用的是最新的牛眼图像和桌面以及树莓派官方网站推荐的软件。

对于工具链,我正在使用这个:https://sourceforge.net/projects/raspberry-pi-cross-compilers/files/Bonus%20Raspberry%20Pi%20GCC%2064-Bit%20Toolchains/Raspberry%20Pi %20GCC%2064-Bit%20交叉编译器%20Toolchains/Bullseye/GCC%2010.2.0/

当我尝试构建任何程序时,我收到此错误消息(即使是由 cmake 执行的初步检查以确保环境能够为目标构建):

/home/user/RPI_BUILD_ENV/toolchain/cross-pi-gcc-10.2.0-64/bin/../lib/gcc/aarch64-linux-gnu/10.2.0/../../../../aarch64-linux-gnu/bin/ld: cannot find crt1.o: No such file or directory
/home/user/RPI_BUILD_ENV/toolchain/cross-pi-gcc-10.2.0-64/bin/../lib/gcc/aarch64-linux-gnu/10.2.0/../../../../aarch64-linux-gnu/bin/ld: cannot find crti.o: No such file or directory
    collect2: error: ld returned 1 exit status

用于链接的命令行如下:

/home/user/RPI_BUILD_ENV/toolchain/cross-pi-gcc-10.2.0-64/bin/aarch64-linux-gnu-gcc   --sysroot=/home/user/RPI_BUILD_ENV/sysroot/   CMakeFiles/cmTC_50c5a.dir/testCCompiler.c.o -o cmTC_50c5a -Wl,-rpath-link,/home/user/RPI_BUILD_ENV/sysroot/lib   -L/home/user/RPI_BUILD_ENV/sysroot/usr/lib  -L/home/user/RPI_BUILD_ENV/sysroot/usr/lib/aarch64-linux-gnu

我检查了 /home/user/RPI_BUILD_ENV/sysroot/usr/lib/aarch64-linux-gnu/crt1.o 和 /home/user/RPI_BUILD_ENV/sysroot/usr/lib/aarch64-linux-gnu/crti.o两者都存在。

我已经检查了工具链在架构 (aarch64) 和 glibc 版本 (2.31) 方面与 sysroot 一致,并且一切都是正确的。

这是我的 cmake 工具链文件的内容:

#
# CMake Toolchain file for crosscompiling on ARM.
#
# Target operating system name.
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_CROSSCOMPILING TRUE)

set(CMAKE_SYSROOT $ENV{RPI_SYSROOT})

# Name of C compiler.
set(CMAKE_C_COMPILER $ENV{RPI_TOOLCHAIN}$ENV{CC})
set(CMAKE_CXX_COMPILER $ENV{RPI_TOOLCHAIN}$ENV{CXX})

set(CMAKE_AR $ENV{RPI_TOOLCHAIN}$ENV{AR})
set(CMAKE_ASM_COMPILER $ENV{RPI_TOOLCHAIN}$ENV{AS})
set(CMAKE_OBJCOPY $ENV{RPI_TOOLCHAIN}$ENV{OBJCOPY})
set(CMAKE_RANLIB $ENV{RPI_TOOLCHAIN}$ENV{RANLIB})

# Target architecture
set(CMAKE_LIBRARY_ARCHITECTURE aarch64-linux-gnu)
set(CMAKE_C_COMPILER_TARGET aarch64-linux-gnu)
set(CMAKE_CXX_COMPILER_TARGET aarch64-linux-gnu)

# Name of linker and its args
set(CMAKE_LINKER $ENV{CXX})
set(CMAKE_CXX_LINK_FLAGS "<FLAGS> --sysroot=$ENV{RPI_SYSROOT} <LINK_FLAGS> <OBJECTS> -o <TARGET> -Wl,-rpath-link,$ENV{RPI_SYSROOT}lib <LINK_LIBRARIES>")
set(CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_LINKER} ${CMAKE_CXX_LINK_FLAGS}")

set(CMAKE_C_LINK_FLAGS "<FLAGS> --sysroot=$ENV{RPI_SYSROOT} <LINK_FLAGS> <OBJECTS> -o <TARGET> -Wl,-rpath-link,$ENV{RPI_SYSROOT}lib <LINK_LIBRARIES>")
set(CMAKE_C_LINK_EXECUTABLE "$ENV{CC} ${CMAKE_C_LINK_FLAGS}")

add_compile_options(-pthread)

# Where to look for the target environment. (More paths can be added here)
set(CMAKE_FIND_ROOT_PATH $ENV{RPI_SYSROOT})

# Where to find header files for target
include_directories(SYSTEM ${CMAKE_FIND_ROOT_PATH}usr/include
                           ${CMAKE_FIND_ROOT_PATH}usr/include/${CMAKE_CXX_COMPILER_TARGET})

# Where to find libraries for target
link_directories(${CMAKE_FIND_ROOT_PATH}/usr/lib/
                 ${CMAKE_FIND_ROOT_PATH}/usr/lib/${CMAKE_CXX_COMPILER_TARGET}/)

# Adjust the default behavior of the FIND_XXX() commands:
# search programs in the host environment only.
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)

# Search headers and libraries in the target environment only.
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

这是我用来配置环境变量的shell脚本的内容:

#!/bin/bash
export RPI_SYSROOT="${HOME}/RPI_BUILD_ENV/sysroot/"
export RPI_TOOLCHAIN="${HOME}/RPI_BUILD_ENV/toolchain/cross-pi-gcc-10.2.0-64/bin/"
export PATH="${RPI_TOOLCHAIN}:${PATH}"
export CC="aarch64-linux-gnu-gcc"
export CXX="aarch64-linux-gnu-g++"
export CPP="aarch64-linux-gnu-gcc"
export LD="aarch64-linux-gnu-ld"
export AR="aarch64-linux-gnu-ar"
export AS="aarch64-linux-gnu-as"
export RANLIB="aarch64-linux-gnu-ranlib"
export STRIP="aarch64-linux-gnu-strip"
export OBJCOPY="aarch64-linux-gnu-objcopy"
export OBJDUMP="aarch64-linux-gnu-objdump"
export NM="aarch64-linux-gnu-nm"
export GDB="aarch64-linux-gnu-gdb"

我不明白发生了什么以及为什么我无法使用此环境链接任何二进制文件。

有人可以帮我解决这个话题吗?

感谢您的帮助。

cmake cross-compiling arm64 raspberry-pi4
1个回答
0
投票

最后,我发现我使用的工具链没有正确配置多架构,然后没有在 /usr/lib/aarch64-linux-gnu 中搜索这些文件。看起来没有办法在 gcc 或 g++ 命令行中添加参数来添加一些搜索此类文件的位置。我切换到Ubuntu中提供的工具链(sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu),一切都运行得更流畅。 希望这会对某人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.