LLVM交叉编译配置指南
前段时间捣鼓交叉编译,发现llvm用来做交叉编译非常合适,只需要3个核心参数
核心编译参数
LLVM/Clang提供了简洁的交叉编译方案,主要使用以下三个参数:
--target- 定义目标平台三元组--gcc-toolchain- 设置目标的GCC编译器路径--sysroot- 指定目标系统的rootfs路径
CMake配置示例
以下是一个完整的CMake交叉编译配置模板,适用于从Termux环境交叉编译到ARM64 glibc目标系统:
cmake
# Set the target system
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
# Set the target triple
set(TARGET_TRIPLE aarch64-linux-gnu)
# Specify the cross compilers
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_ASM_COMPILER clang)
# Set the sysroot path.
# YOU MUST CHANGE THIS to the root of your aarch64-linux-gnu toolchain/sysroot.
set(CMAKE_SYSROOT /data/data/com.termux/files/home/gcc/aarch64-linux-gnu/libc)
# Set the path to the GCC toolchain for Clang to use
# YOU MUST CHANGE THIS to the root of your aarch64-linux-gnu GCC toolchain.
set(GCC_TOOLCHAIN_PATH /data/data/com.termux/files/home/gcc)
# Set compiler flags
set(CMAKE_C_FLAGS "--target=${TARGET_TRIPLE} --sysroot=${CMAKE_SYSROOT} --gcc-toolchain=${GCC_TOOLCHAIN_PATH}" CACHE STRING "C compiler flags")
set(CMAKE_CXX_FLAGS "--target=${TARGET_TRIPLE} --sysroot=${CMAKE_SYSROOT} --gcc-toolchain=${GCC_TOOLCHAIN_PATH} -stdlib=libstdc++" CACHE STRING "C++ compiler flags")
set(CMAKE_ASM_FLAGS "--target=${TARGET_TRIPLE} --sysroot=${CMAKE_SYSROOT} --gcc-toolchain=${GCC_TOOLCHAIN_PATH}" CACHE STRING "ASM compiler flags")
# Where to look for the target environment
set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})
# Adjust the find behavior to search only in the 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)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)配置说明
必须修改的路径
CMAKE_SYSROOT: 需要设置为aarch64-linux-gnu工具链的libc目录路径GCC_TOOLCHAIN_PATH: 需要设置为aarch64-linux-gnu GCC工具链的根目录路径
关键配置项
- 目标三元组:
aarch64-linux-gnu指定了ARM64架构和GNU libc环境 - 编译器选择: 使用Clang系列编译器进行交叉编译
- 标准库: C++使用libstdc++标准库(与GCC工具链兼容)
查找路径配置
配置了CMake在目标系统根目录下查找库文件、头文件和包,但在主机系统上查找程序。
使用说明
- 确保已安装LLVM/Clang编译器
- 准备好对应的GCC交叉编译工具链
- 修改上述配置中的路径指向您的实际工具链位置
- 使用CMake配置和构建项目
注意事项
- 此配置适用于使用GCC-linaro工具链的情况,改名成了gcc
- 确保目标工具链与Host系统的兼容性
- 不同的目标架构需要调整相应的目标三元组
- 有些项目用了汇编代码,所以汇编编译器也要设置交叉编译链