温馨提示×

ubuntu Fortran如何交叉编译

小樊
45
2026-10-01 07:56:14
栏目: 智能运维

在 Ubuntu 上交叉编译 Fortran 程序,核心思路是:
安装目标平台的交叉编译工具链(含 gfortran)→ 用交叉 gfortran 编译 → 处理库依赖。

下面按常见场景说明。


一、交叉编译是什么(简要)

交叉编译 = 在 x86_64 Ubuntu 上,编译出 ARM / RISC-V / Windows 等平台上可运行的 Fortran 程序。

关键工具:

  • x86_64-linux-gnu-gfortran
  • arm-linux-gnueabihf-gfortran
  • aarch64-linux-gnu-gfortran
  • x86_64-w64-mingw32-gfortran(Windows)

二、Ubuntu 安装交叉 Fortran 编译器

1️⃣ 编译到 ARM 32 位(armhf)

sudo apt update
sudo apt install gfortran-arm-linux-gnueabihf

使用:

arm-linux-gnueabihf-gfortran hello.f90 -o hello_arm

2️⃣ 编译到 ARM 64 位(aarch64)

sudo apt install gfortran-aarch64-linux-gnu

使用:

aarch64-linux-gnu-gfortran hello.f90 -o hello_aarch64

3️⃣ 编译到 Windows(MinGW)

sudo apt install gfortran-mingw-w64

使用:

x86_64-w64-mingw32-gfortran hello.f90 -o hello.exe

4️⃣ 编译到 RISC-V(示例)

sudo apt install gfortran-riscv64-linux-gnu

三、最小 Fortran 示例

hello.f90

program hello
    print *, "Hello from Fortran!"
end program hello

编译:

aarch64-linux-gnu-gfortran hello.f90 -o hello
file hello
# hello: ELF 64-bit LSB executable, ARM aarch64

四、链接第三方 Fortran 库(重点)

情况 1:纯 Fortran 库

需要确保库也是 交叉编译的

aarch64-linux-gnu-gfortran main.f90 \
  -L/path/to/arm/lib \
  -lmylib

情况 2:BLAS / LAPACK

sudo apt install liblapack-dev-arm64-cross

或自己交叉编译 OpenBLAS。


五、CMake 交叉编译 Fortran

工具链文件 arm.cmake

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER   aarch64-linux-gnu-gcc)
set(CMAKE_Fortran_COMPILER aarch64-linux-gnu-gfortran)
set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)

构建:

cmake -DCMAKE_TOOLCHAIN_FILE=arm.cmake ..
make

六、常见问题

❌ 找不到 Fortran 编译器

which aarch64-linux-gnu-gfortran

没有就安装对应包。


❌ 链接到宿主机库

错误示例:

skipping incompatible /usr/lib/libxxx.so

✅ 必须用 交叉编译的库


❌ 运行平台不一致

交叉编译的程序 不能在 Ubuntu 直接运行

./hello_aarch64
# Exec format error

需用 QEMU 或目标板:

qemu-aarch64 ./hello_aarch64

七、总结

目标平台 安装命令
ARM32 gfortran-arm-linux-gnueabihf
ARM64 gfortran-aarch64-linux-gnu
Windows gfortran-mingw-w64
RISC-V gfortran-riscv64-linux-gnu

如果你能告诉我:

  • ✅ 目标平台(ARM / Windows / 龙芯 / 嵌入式)
  • ✅ 是否用 CMake / Makefile
  • ✅ 是否依赖 BLAS/LAPACK

我可以直接给你 完整可跑的编译命令或工程模板。

0 踩