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
浙公網安備 33010602011771號