在 Ubuntu 上进行 C++ 交叉编译,核心思路是:
用 Ubuntu 上的编译器,生成在另一种架构/系统上运行的可执行文件。
下面按常见场景给你一套清晰做法。
交叉编译三要素:
arm-linux-gnueabihf-g++sudo apt update
sudo apt install g++-arm-linux-gnueabihf
使用:
arm-linux-gnueabihf-g++ main.cpp -o main_arm
sudo apt install g++-aarch64-linux-gnu
使用:
aarch64-linux-gnu-g++ main.cpp -o main_arm64
sudo apt install g++-riscv64-linux-gnu
riscv64-linux-gnu-g++ main.cpp -o main_riscv
file main_arm
示例输出:
main_arm: ELF 32-bit LSB executable, ARM, ...
arm.cmakeset(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../arm.cmake ..
make
sudo apt install libstdc++-arm-linux-gnueabihf-dev
或复制开发板上的:
/usr/lib
/usr/include
指定 sysroot:
--sysroot=/path/to/sysroot
CMake 示例:
set(CMAKE_SYSROOT /path/to/sysroot)
vcpkg install zlib --triplet=arm-linux
例如 ARM Cortex-M:
sudo apt install gcc-arm-none-eabi
arm-none-eabi-g++ main.cpp -o firmware.elf
not foundlibstdc++.so-static
file 可执行文件
uname -m
✅ 树莓派
✅ 嵌入式 Linux
✅ Android NDK
✅ 路由器 / IoT
✅ 国产芯片(飞腾、龙芯)
如果你能告诉我:
我可以直接给你一套 可复制的完整编译命令。