重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
cross-gcc by mohitmishra786/low-level-dev-skills
npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill cross-gcc指导代理完成交叉编译 GCC 工具链的设置和使用:包括目标三元组、系统根目录、pkg-config、基于 QEMU 的测试以及常见故障模式。
一个 GNU 目标三元组的形式为 <架构>-<供应商>-<操作系统>-<应用程序二进制接口>(通常是 3 或 4 部分):
| 目标三元组 | 目标平台 |
|---|---|
aarch64-linux-gnu | 64 位 ARM Linux (glibc) |
arm-linux-gnueabihf | 32 位 ARM Linux 硬浮点 |
arm-none-eabi |
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 裸机 ARM (无操作系统) |
riscv64-linux-gnu | 64 位 RISC-V Linux |
x86_64-w64-mingw32 | 从 Linux 编译到 Windows (MinGW) |
mipsel-linux-gnu | 小端序 MIPS Linux |
# Debian/Ubuntu
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu
# For bare-metal ARM (Cortex-M)
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi
# Verify
aarch64-linux-gnu-gcc --version
# C
aarch64-linux-gnu-gcc -O2 -o hello hello.c
# C++
aarch64-linux-gnu-g++ -O2 -std=c++17 -o hello hello.cpp
# Bare-metal (no stdlib, no OS)
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 \
-ffreestanding -nostdlib -T linker.ld -o firmware.elf startup.s main.c
系统根目录是一个包含目标平台头文件和库文件的目录。当你的代码链接到特定于目标平台的库时,这是必需的。
# Use a sysroot
aarch64-linux-gnu-gcc --sysroot=/path/to/aarch64-sysroot -O2 -o prog main.c
# Common sysroot sources:
# - Raspberry Pi: download from raspbian/raspios
# - Debian multiarch: debootstrap --arch arm64 bullseye /tmp/sysroot
# - Yocto/Buildroot: generated automatically in build output
验证系统根目录是否正确:
aarch64-linux-gnu-gcc --sysroot=/path/to/sysroot -v -E - < /dev/null 2>&1 | grep sysroot
默认情况下,pkg-config 会返回主机库的路径。需要覆盖设置:
export PKG_CONFIG_SYSROOT_DIR=/path/to/sysroot
export PKG_CONFIG_LIBDIR=${PKG_CONFIG_SYSROOT_DIR}/usr/lib/aarch64-linux-gnu/pkgconfig:${PKG_CONFIG_SYSROOT_DIR}/usr/share/pkgconfig
export PKG_CONFIG_PATH= # clear host path
pkg-config --libs libssl # now returns target paths
创建一个工具链文件 aarch64.cmake:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_SYSROOT /path/to/aarch64-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)
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=aarch64.cmake
cmake --build build
# User-mode emulation (Linux binaries, no full OS)
sudo apt install qemu-user-static
qemu-aarch64-static ./hello
# Or set binfmt_misc for transparent execution:
# Then just: ./hello
# GDB remote debug via QEMU
qemu-aarch64-static -g 1234 ./hello &
aarch64-linux-gnu-gdb -ex "target remote :1234" ./hello
| 错误 | 原因 | 修复方法 |
|---|---|---|
cannot execute binary file: Exec format error | 在没有 QEMU 的主机上运行目标二进制文件 | 使用 qemu-<arch>-static |
wrong ELF class: ELFCLASS64 (或 32) | 链接了错误架构的目标文件 | 检查目标三元组;确保所有目标文件使用相同的工具链 |
/usr/bin/ld: cannot find -lfoo | 交叉链接时使用了主机库路径 | 设置 --sysroot;修正 PKG_CONFIG_LIBDIR |
undefined reference to '__aeabi_*' | 缺少 ARM ABI 运行时库 | 链接时添加 -lgcc 或 -lclang_rt.builtins |
relocation R_AARCH64_ADR_PREL_PG_HI21 out of range | 距离过大 | 使用 -mcmodel=large 或重构代码 |
unrecognized opcode | 错误的 -mcpu 或 -march 标志 | 为目标平台设置正确的 CPU 标志 |
# Tell build systems to use cross-compiler
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export AR=aarch64-linux-gnu-ar
export STRIP=aarch64-linux-gnu-strip
export OBJDUMP=aarch64-linux-gnu-objdump
# For autoconf projects
./configure --host=aarch64-linux-gnu --prefix=/usr
有关 ARM 特定 GCC 标志的参考,请参阅 references/arm-flags.md。
skills/compilers/gcc 获取 GCC 标志详情skills/debuggers/gdb 通过 gdbserver 进行远程调试skills/low-level-programming/assembly-arm 获取 AArch64 汇编细节skills/build-systems/cmake 进行工具链文件设置每周安装次数
50
代码仓库
GitHub 星标数
34
首次出现
2026年2月20日
安全审计
已安装于
gemini-cli49
github-copilot49
amp49
codex49
kimi-cli49
opencode49
Guide agents through setting up and using cross-compilation GCC toolchains: triplets, sysroots, pkg-config, QEMU-based testing, and common failure modes.
A GNU triplet has the form <arch>-<vendor>-<os>-<abi> (often 3 or 4 parts):
| Triplet | Target |
|---|---|
aarch64-linux-gnu | 64-bit ARM Linux (glibc) |
arm-linux-gnueabihf | 32-bit ARM Linux hard-float |
arm-none-eabi | Bare-metal ARM (no OS) |
riscv64-linux-gnu | 64-bit RISC-V Linux |
x86_64-w64-mingw32 | Windows (MinGW) from Linux |
mipsel-linux-gnu | Little-endian MIPS Linux |
# Debian/Ubuntu
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu
# For bare-metal ARM (Cortex-M)
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi
# Verify
aarch64-linux-gnu-gcc --version
# C
aarch64-linux-gnu-gcc -O2 -o hello hello.c
# C++
aarch64-linux-gnu-g++ -O2 -std=c++17 -o hello hello.cpp
# Bare-metal (no stdlib, no OS)
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 \
-ffreestanding -nostdlib -T linker.ld -o firmware.elf startup.s main.c
A sysroot is a directory containing the target's headers and libraries. Required when your code links against target-specific libraries.
# Use a sysroot
aarch64-linux-gnu-gcc --sysroot=/path/to/aarch64-sysroot -O2 -o prog main.c
# Common sysroot sources:
# - Raspberry Pi: download from raspbian/raspios
# - Debian multiarch: debootstrap --arch arm64 bullseye /tmp/sysroot
# - Yocto/Buildroot: generated automatically in build output
Verify the sysroot is correct:
aarch64-linux-gnu-gcc --sysroot=/path/to/sysroot -v -E - < /dev/null 2>&1 | grep sysroot
pkg-config will return host library paths by default. Override:
export PKG_CONFIG_SYSROOT_DIR=/path/to/sysroot
export PKG_CONFIG_LIBDIR=${PKG_CONFIG_SYSROOT_DIR}/usr/lib/aarch64-linux-gnu/pkgconfig:${PKG_CONFIG_SYSROOT_DIR}/usr/share/pkgconfig
export PKG_CONFIG_PATH= # clear host path
pkg-config --libs libssl # now returns target paths
Create a toolchain file aarch64.cmake:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
set(CMAKE_SYSROOT /path/to/aarch64-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)
cmake -S . -B build -DCMAKE_TOOLCHAIN_FILE=aarch64.cmake
cmake --build build
# User-mode emulation (Linux binaries, no full OS)
sudo apt install qemu-user-static
qemu-aarch64-static ./hello
# Or set binfmt_misc for transparent execution:
# Then just: ./hello
# GDB remote debug via QEMU
qemu-aarch64-static -g 1234 ./hello &
aarch64-linux-gnu-gdb -ex "target remote :1234" ./hello
| Error | Cause | Fix |
|---|---|---|
cannot execute binary file: Exec format error | Running target binary on host without QEMU | Use qemu-<arch>-static |
wrong ELF class: ELFCLASS64 (or 32) | Wrong-architecture object linked | Check triplet; ensure all objects use same toolchain |
/usr/bin/ld: cannot find -lfoo | Host library path used for cross-link | Set --sysroot; fix PKG_CONFIG_LIBDIR |
# Tell build systems to use cross-compiler
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++
export AR=aarch64-linux-gnu-ar
export STRIP=aarch64-linux-gnu-strip
export OBJDUMP=aarch64-linux-gnu-objdump
# For autoconf projects
./configure --host=aarch64-linux-gnu --prefix=/usr
For a reference on ARM-specific GCC flags, see references/arm-flags.md.
skills/compilers/gcc for GCC flag detailsskills/debuggers/gdb for remote debugging with gdbserverskills/low-level-programming/assembly-arm for AArch64 assembly specificsskills/build-systems/cmake for toolchain file setupWeekly Installs
50
Repository
GitHub Stars
34
First Seen
Feb 20, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
gemini-cli49
github-copilot49
amp49
codex49
kimi-cli49
opencode49
React 组合模式指南:Vercel 组件架构最佳实践,提升代码可维护性
127,000 周安装
undefined reference to '__aeabi_*' | Missing ARM ABI runtime | Link with -lgcc or -lclang_rt.builtins |
relocation R_AARCH64_ADR_PREL_PG_HI21 out of range | Distance too large | Use -mcmodel=large or restructure |
unrecognized opcode | Wrong -mcpu or -march | Set correct CPU flags for target |