You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为aarch64-linux-gnu交叉编译GDAL?依赖编译问题求解

解决GDAL交叉编译到aarch64-linux-gnu的依赖问题及优化方案

问题背景

在ZCU106(ARM64)开发板上使用Rust的GDAL crate时,需要交叉编译C语言实现的GDAL库。当前使用CMake工具链文件进行交叉编译时,出现PROJ、SQLite3等依赖缺失的问题,手动编译依赖又陷入链式依赖困境。

分步解决方案

1. 优先使用系统提供的交叉编译依赖包(推荐)

大多数Linux发行版(如Ubuntu)支持直接安装ARM64架构的预编译依赖包,无需手动编译:

  • 添加ARM64架构支持:
    sudo dpkg --add-architecture arm64
    sudo apt update
    
  • 安装GDAL及PROJ所需的核心依赖:
    sudo apt install libproj-dev:arm64 libsqlite3-dev:arm64 libz-dev:arm64 libexpat1-dev:arm64 libiconv-hook-dev:arm64
    
  • 若不需要某些可选功能(如ODBC、MySQL),可跳过对应依赖,后续编译GDAL时直接禁用。

2. 完善CMake工具链文件

修改你的toolchain_file.cmake,添加目标架构的根路径搜索规则,确保CMake优先查找ARM64的库而非主机的x86_64库:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)

# 指定目标架构的sysroot路径
set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
# 禁止查找主机的可执行文件,只查找目标架构的库、头文件和包
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)

3. 编译GDAL(带系统依赖)

再次执行CMake命令,此时CMake会自动找到已安装的ARM64依赖:

cmake ../gdal/ -DCMAKE_TOOLCHAIN_FILE=toolchain_file.cmake -DCMAKE_INSTALL_PREFIX=./install
  • 若仍有可选依赖缺失,可通过CMake参数禁用:
    cmake ../gdal/ -DCMAKE_TOOLCHAIN_FILE=toolchain_file.cmake -DCMAKE_INSTALL_PREFIX=./install \
      -DWITH_ODBC=OFF -DWITH_MYSQL=OFF -DWITH_XERCESC=OFF
    

4. 手动编译依赖(当系统无预编译包时)

如果必须手动编译依赖,需按依赖顺序逐个编译,并统一安装路径:

编译SQLite3

mkdir build-sqlite && cd build-sqlite
cmake ../sqlite-src -DCMAKE_TOOLCHAIN_FILE=../toolchain_file.cmake -DCMAKE_INSTALL_PREFIX=../install
make && make install

编译PROJ

mkdir build-proj && cd build-proj
cmake ../proj-9.4.0/ -DCMAKE_TOOLCHAIN_FILE=../toolchain_file.cmake -DCMAKE_INSTALL_PREFIX=../install \
  -DSQLITE3_LIBRARY=../install/lib/libsqlite3.so -DSQLITE3_INCLUDE_DIR=../install/include
make && make install

编译GDAL

mkdir build-gdal && cd build-gdal
cmake ../gdal/ -DCMAKE_TOOLCHAIN_FILE=../toolchain_file.cmake -DCMAKE_INSTALL_PREFIX=../install \
  -DPROJ_DIR=../install/lib/cmake/PROJ
make && make install

更优的交叉编译方式

1. 使用Docker原生编译

创建ARM64架构的Docker容器,在容器内直接编译GDAL,无需处理交叉编译工具链:

# 启动ARM64 Ubuntu容器
docker run --platform linux/arm64 -it ubuntu:latest
# 在容器内安装依赖和编译
apt update && apt install build-essential cmake libproj-dev libsqlite3-dev
git clone https://github.com/libgeotiff/gdal.git
mkdir build && cd build
cmake ../gdal -DCMAKE_INSTALL_PREFIX=/opt/gdal
make && make install
# 将编译好的库复制到主机
docker cp <容器ID>:/opt/gdal ./aarch64-gdal

2. 使用Buildroot/Yocto构建系统

对于嵌入式开发场景,Buildroot或Yocto可以一次性构建包含GDAL及所有依赖的根文件系统,自动处理交叉编译和依赖管理,适合复杂项目的长期维护。

内容的提问来源于stack exchange,提问作者arya-p

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:50:01