在 CentOS 上进行 C++ 交叉编译,通常是指:在 x86_64 的 CentOS 上,编译出能在其他架构(如 ARM、aarch64、mips 等)上运行的程序。下面按常见场景 + 实操步骤说明。
交叉编译 = 本机编译器(host) + 目标平台工具链(target)
关键要素:
aarch64-linux-gnu-g++)--target / -march 等参数sudo dnf install -y gcc-c++ aarch64-linux-gnu-gcc aarch64-linux-gnu-g++
sudo yum install -y centos-release-scl
sudo yum install -y devtoolset-9-gcc-c++
sudo yum install -y arm-linux-gnu-gcc
如果没有对应包,可使用 Linaro / Bootlin 工具链(推荐)
示例 test.cpp:
#include <iostream>
int main() {
std::cout << "Hello ARM" << std::endl;
}
编译:
aarch64-linux-gnu-g++ test.cpp -o test_arm
查看文件类型:
file test_arm
# test_arm: ELF 64-bit LSB executable, ARM aarch64
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar -xf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
使用:
export PATH=$PWD/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
aarch64-linux-gnu-g++ test.cpp -o test_arm
toolchain.cmakeset(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_FIND_ROOT_PATH /opt/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)
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..
make
要点:
aarch64-linux-gnu-g++ main.cpp \
-I/opt/sysroot/usr/include \
-L/opt/sysroot/usr/lib \
-lopencv_core -lopencv_highgui
cannot find crt1.o原因:缺少目标平台 sysroot
解决:安装 aarch64-linux-gnu-glibc 或指定 --sysroot
aarch64-linux-gnu-g++ test.cpp --sysroot=/opt/sysroot
Illegal instruction原因:CPU 架构不匹配
解决:指定正确 -march
aarch64-linux-gnu-g++ -march=armv8-a test.cpp
✅ CentOS 交叉编译核心步骤:
xxx-g++ 编译如果你告诉我:
我可以给你完全针对性的命令。