Debian上部署Fortran程序的可执行包方案
一 准备与编译
- 安装工具链与依赖
- 安装编译器与构建工具:sudo apt-get update && sudo apt-get install -y gfortran build-essential cmake。
- 若使用第三方库(如BLAS/LAPACK、MPI、HDF5、NetCDF),优先通过APT安装开发包(例如:libopenblas-dev、liblapack-dev、libmpi-dev、libhdf5-dev、libnetcdf-dev),便于自动解决依赖与ABI兼容。
- 构建方式
- 单文件:gfortran hello.f90 -O2 -o hello
- 多文件:gfortran -O2 -c mod1.f90 mod2.f90;gfortran -O2 main.f90 mod1.o mod2.o -o app
- 推荐开启优化与警告:-O2/-O3 -Wall -Wextra;调试阶段加**-g并可用valgrind**检查内存。
- 使用CMake管理复杂工程(示例见下文“打包脚本要点”)。
二 本地安装与运行
- 直接安装到系统目录(适合个人或小团队)
- 可执行文件:sudo install -Dm755 app /usr/local/bin/app
- 库文件:sudo install -Dm644 libmylib.so /usr/local/lib/libmylib.so
- 头文件:sudo install -Dm644 include/*.mod /usr/local/include/
- 配置动态库缓存:sudo ldconfig
- 运行:直接执行app或使用完整路径**/usr/local/bin/app**。
- 用户级安装(无需sudo)
- 可执行文件:install -Dm755 app ~/.local/bin/app
- 库文件:install -Dm644 libmylib.so ~/.local/lib/libmylib.so
- 头文件:install -Dm644 include/*.mod ~/.local/include/
- 更新缓存:echo “$HOME/.local/lib” | sudo tee /etc/ld.so.conf.d/local.conf && sudo ldconfig
- 将**~/.local/bin加入PATH**(写入~/.bashrc 或 ~/.profile)。
三 打包为Debian二进制包 deb(推荐用于分发与上线)
- 目录与元信息
- 安装打包工具:sudo apt-get install -y build-essential devscripts debhelper dh-make
- 生成模板:在源码根目录执行dh_make -p appname_1.0.0 --createorig(选择单二进制包 s)。
- 关键文件:
- debian/control:设置包名、版本、架构、依赖(如:gfortran, libc6 (>= 2.28), libopenblas-dev)。
- debian/rules:可执行模板(示例见下),使用dh自动完成安装与脚本钩子。
- debian/install:列出要安装到系统各目录的文件(示例:app usr/bin;libmylib.so usr/lib;*.mod usr/include)。
- 可选:debian/changelog、debian/copyright、debian/compat。
- 构建与安装
- 构建:在源码根目录执行dpkg-buildpackage -us -uc -b,产物为**…/appname_1.0.0_amd64.deb**。
- 安装:sudo apt install …/appname_1.0.0_amd64.deb;卸载:sudo apt remove appname。
- 打包脚本要点(示例)
- debian/rules(可执行模板,使用dh)
#!/usr/bin/make -f
%:
dh $@ --with=systemd # 如涉及systemd服务,可加上该选项
override_dh_auto_build:
gfortran -O2 -fPIC -c src/mod1.f90 src/mod2.f90
gfortran -O2 -o src/app src/main.f90 src/*.o -lopenblas
override_dh_auto_install:
dh_auto_install
install -Dm755 src/app $(CURDIR)/debian/appname/usr/bin/app
install -Dm644 lib/libmylib.so $(CURDIR)/debian/appname/usr/lib/libmylib.so
install -Dm644 include/*.mod $(CURDIR)/debian/appname/usr/include/
- debian/install(示例)
src/app usr/bin
lib/libmylib.so usr/lib
include/*.mod usr/include
- debian/control(片段)
Source: appname
Section: science
Priority: optional
Maintainer: Your Name <you@example.com>
Build-Depends: debhelper-compat (= 13), gfortran, cmake, libopenblas-dev, liblapack-dev
Standards-Version: 4.5.1
Homepage: https://example.com
Package: appname
Architecture: amd64
Depends: ${shlibs:Depends}, ${misc:Depends}, gfortran
Description: A short description of your Fortran application.
四 服务化与运维
五 常见问题与处理
- 依赖冲突与破损包
- 先尝试修复:sudo apt-get -f install;更新索引:sudo apt-get update;必要时使用aptitude交互式求解依赖;避免随意强制版本。
- 动态库找不到
- 确认库路径在**/etc/ld.so.conf或/etc/ld.so.conf.d/*.conf中,执行sudo ldconfig**;运行时可用ldd app检查缺失库。
- 多架构与交叉编译
- 为目标架构构建:在amd64主机上安装crossbuild-essential-arm64等工具链,设置DEB_HOST_ARCH=arm64后打包;或使用pbuilder/qemu-debootstrap在干净环境中构建。
- 云服务器与最小化系统
- 先安装gfortran与必要运行时(如libopenblas0、libgfortran5),再部署可执行文件或服务单元;无图形环境时避免依赖GUI库。