Linux交叉编译Arm64 C++程序
Linux交叉编译Arm64 C++程序
1、开发环境
os: debian 12
2、安装交叉编译工具链
1 sudo apt update 2 sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
3、交叉编译
- 编写测试代码
1 #include <iostream> 2 3 int main() { 4 std::cout << "Hello, AArch64 Cross-Compilation!" << std::endl; 5 return 0; 6 }
- 使用交叉编译器编译
1 aarch64-linux-gnu-g++ hello.cpp -o hello_aarch64 -static # 静态链接 2 # 或 3 aarch64-linux-gnu-g++ hello.cpp -o hello_aarch64 # 动态链接
- 检查可执行文件
file hello_aarch64
输出:
hello_aarch64: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=a9c98e6f73b59b9f5b04c9b3f663f15d26bb7de2, for GNU/Linux 3.7.0, not stripped
4、使用CMake进行交叉编译
- 创建工具链文件aarch64-toolchain.cmake
1 # aarch64-toolchain.cmake 2 3 # 基本交叉编译配置 4 set(CMAKE_SYSTEM_NAME Linux) 5 set(CMAKE_SYSTEM_PROCESSOR aarch64) 6 7 # 指定编译器 8 set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) 9 set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) 10 11 # 指定C++标准 (C++11/14/17/20) 12 set(CMAKE_CXX_STANDARD 20) 13 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 必须使用指定的标准 14 set(CMAKE_CXX_EXTENSIONS OFF) # 禁用编译器特定扩展 15 16 # 搜索路径设置 17 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 18 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 19 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 20 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 21 22 # 可选:指定目标系统根目录(如果使用sysroot) 23 # set(CMAKE_SYSROOT /path/to/aarch64/sysroot) 24 # set(CMAKE_FIND_ROOT_PATH /path/to/aarch64/sysroot)
- 创建CMakeLists.txt
cmake_minimum_required(VERSION 3.10) project(HelloWorld) # 设置C++标准 set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 生成可执行文件 add_executable(hello hello.cpp)
- 构建项目
mkdir build && cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=../aarch64-toolchain.cmake make
5、在x86主机上测试(使用QEMU)
- 安装QEMU模拟器
sudo apt install qemu-user-static
- 直接使用QEMU
运行动态链接库版本
qemu-aarch64-static -L /usr/aarch64-linux-gnu/ ./hello
运行静态链接库版本
qemu-aarch64-static ./hello_aarch64
6、编译boost arm64静态库
编译前确保交叉编译依赖
1 # 安装常用 ARM64 开发库 2 sudo apt-get install \ 3 libssl-dev:arm64 \ 4 libbz2-dev:arm64 \ 5 libicu-dev:arm64 \ 6 zlib1g-dev:arm64
启用C++20标准
1 export CXXFLAGS="-std=c++20"
下载boost_1_88_0和解压
1 wget https://archives.boost.io/release/1.88.0/source/boost_1_88_0.tar.gz 2 tar -xzvf boost_1_88_0.tar.gz 3 cd boost_1_88_0
执行配置
1 ./bootstrap.sh
修改project-config.jam文件
if ! gcc in [ feature.values <toolset> ] { using gcc : : /usr/bin/aarch64-linux-gnu-gcc ; }
编译安装boos库(含静态库和动态库)
1 sudo ./b2
在stage目录下找一个库查看
1 file libboost_system.so.1.88.0
7、编译POCO Arm64静态库
下载Poco源码
1 wget https://github.com/pocoproject/poco/archive/refs/tags/poco-1.14.0-release.tar.gz 2 tar -xvf poco-1.14.0-release.tar.gz 3 cd poco-1.14.0-release
创建Cmake工具链 aarch64-toolchain.cmake
1 # aarch64-toolchain.cmake 2 set(CMAKE_SYSTEM_NAME Linux) 3 set(CMAKE_SYSTEM_PROCESSOR aarch64) 4 5 # 指定交叉编译器 6 set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) 7 set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++) 8 9 # 静态库专用设置 10 set(BUILD_SHARED_LIBS OFF) # 禁用共享库 11 set(POCO_STATIC ON) # 强制使用静态库 12 13 # 查找策略 14 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) 15 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) 16 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) 17 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) 18 19 # 优化选项(根据目标CPU调整) 20 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -pipe -march=armv8-a")
配置静态库构建
1 cmake .. -DCMAKE_TOOLCHAIN_FILE=../aarch64-toolchain.cmake -DCMAKE_INSTALL_PREFIX=../poco-static-aarch64 -DENABLE_XML=ON -DENABLE_JSON=ON -DENABLE_CPPPARSER=ON -DENABLE_PAGECOMPILER=ON -DENABLE_ACTIVERECORD=ON -DENABLE_UTIL=ON -DENABLE_FOUNDATION=ON
编译安装静态库
1 make -j$(nproc) 2 make install
8、编译curl arm64静态库
8.1 交叉编译OpenSSL
1 # 下载 OpenSSL 2 wget https://www.openssl.org/source/openssl-3.0.9.tar.gz 3 tar -xzvf openssl-3.0.9.tar.gz 4 cd openssl-3.0.9 5 6 # 编译 ARM64 OpenSSL 7 ./Configure linux-aarch64 no-shared \ 8 --prefix=$(pwd)/install_arm64 \ 9 --cross-compile-prefix=aarch64-linux-gnu- 10 make -j$(nproc) 11 make install
8.2 交叉编译curl静态库
1 wget https://curl.se/download/curl-8.11.1.tar.gz 2 tar -xzvf curl-8.11.1.tar.gz 3 cd curl-8.11.1 4 5 ./configure \ 6 --host=aarch64-linux-gnu \ 7 --prefix=$(pwd)/install_arm64 \ 8 --disable-shared \ 9 --enable-static \ 10 --without-zlib \ 11 --with-ssl=$(pwd)/../openssl-3.0.9/install_arm64 \ 12 CC=aarch64-linux-gnu-gcc \ 13 CXX=aarch64-linux-gnu-g++ \ 14 AR=aarch64-linux-gnu-ar \ 15 RANLIB=aarch64-linux-gnu-ranlib