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

 

 

posted @ 2025-06-05 09:28  钟齐峰  阅读(892)  评论(0)    收藏  举报