在 CentOS 上使用 Fortran 进行 GUI 开发的可行路径
- 使用支持 Fortran 的 GUI 库(如 GTK+ 的 gtk-fortran、FLTK 的 Fortran 绑定)直接编写界面。
- 采用混合编程:用 C/C++ + Qt/GTK 做 GUI,Fortran 负责计算,通过 ISO_C_BINDING 或 C 接口调用。
- 远程开发时,在本地安装 VS Code 并配合 fortls 语言服务器与远程 SSH 插件,获得接近 GUI 的开发体验。
环境准备
- 安装图形桌面(若服务器为最小化安装):
- CentOS 7:sudo yum groupinstall “X Window System” “MATE Desktop” -y && sudo systemctl set-default graphical.target && sudo reboot
- CentOS 8:sudo dnf groupinstall “Desktop Platform” “Fonts” -y && sudo reboot
- 安装编译与开发工具:
- sudo yum groupinstall “Development Tools” -y
- sudo yum install gcc-gfortran -y
- 安装常用 GUI 开发库(按需选择其一或多项):
- GTK+ 2/3:sudo yum install gtk2-devel gtk3-devel -y
- Qt5:sudo yum install qt5-qtbase-devel -y
- FLTK:sudo yum install fltk-devel -y
- 可选:OpenGL 支持 sudo yum install mesa-libGL-devel -y
- 远程桌面可选:sudo yum install x11vnc -y(便于本地 VNC 客户端连接)
方案一 使用 gtk-fortran 开发 GTK 界面
- 安装 gtk-fortran(EPEL 通常提供):sudo yum install epel-release -y && sudo yum install gtk-fortran -y
- 编译与运行要点:
- 使用 pkg-config 获取编译与链接参数:pkg-config --cflags --libs gtk±3.0
- 示例命令:gfortran hello.f90 -o hello
pkg-config --cflags --libs gtk+-3.0
- 最小示例(GTK 3,事件回调用 C 函数指针,gtk-fortran 提供 c_funloc):
- program hello_gtk
use gtk
implicit none
type(GtkWindow) :: window
type(GtkButton) :: button
call gtk_init()
window = gtk_window_new(GTK_WINDOW_TOPLEVEL)
call gtk_window_set_title(GTK_WINDOW(window), “Hello GTK+ Fortran”)
call gtk_window_set_default_size(GTK_WINDOW(window), 300, 200)
button = gtk_button_new_with_label(“Click Me”)
call gtk_container_add(GTK_CONTAINER(window), button)
call g_signal_connect(window, "destroy"c_null_char, c_funloc(gtk_main_quit), c_null_ptr)
call g_signal_connect(button, "clicked"c_null_char, c_funloc(on_button_clicked), c_null_ptr)
call gtk_widget_show_all(window)
call gtk_main()
contains
subroutine on_button_clicked(widget, data)
type(GtkWidget), intent(in) :: widget
call gtk_main_quit()
end subroutine on_button_clicked
end program hello_gtk
- 说明:
- 若使用 GTK 2,将 pkg-config 参数改为 gtk±2.0,并注意 API 差异。
- 回调需为 C 接口,gtk-fortran 提供 c_funloc/c_null_ptr 等辅助。
方案二 使用 FLTK 的 Fortran 绑定
- 安装 FLTK 与 Fortran 绑定(若仓库提供):sudo yum install fltk-devel fltk-fortran -y
- 编译与运行要点:
- 示例命令:gfortran main.f90 -o fltk_app -lfltk -lX11 -lm -lpthread
- 最小示例(FLTK 风格):
- program fltk_demo
use fltk
implicit none
type(Fl_Window) :: win
type(Fl_Button) :: btn
win = Fl_Window_new(300, 200, “FLTK Fortran”)
btn = Fl_Button_new(100, 70, 100, 40, “Click Me”)
call Fl_Window_show(win)
call Fl_Run()
end program fltk_demo
- 说明:
- 若发行版仓库未提供 Fortran 绑定,可改为 C/C++ 写 GUI,Fortran 仅提供计算例程(见下一节)。
方案三 混合编程 Qt 或 GTK + Fortran 计算
- 适用场景:需要 Qt 的丰富组件 或已有 Qt/GTK C/C++ 界面框架。
- 基本思路:
- 用 C/C++ 实现 GUI(Qt Widgets/QML 或 GTK),将计算密集型函数用 ISO_C_BINDING 暴露给 C,再由 Fortran 调用或反向调用。
- 构建系统使用 CMake 管理 Fortran 与 C/C++ 混合目标,链接对应 GUI 库(Qt5Widgets、gtk-3.0 等)。
- 最小集成示例(Fortran 调用 C 函数):
- C 头文件(add.h):void add_(const int*, const int*, int*);
- C 实现(add.c):void add_(const int* a, const int* b, int* c) { *c = *a + *b; }
- Fortran 调用(main.f90):
- program main
use iso_c_binding
implicit none
interface
subroutine add_(a, b, c) bind(c, name=“add_”)
import :: c_int
integer(c_int), intent(in) :: a, b
integer(c_int), intent(out) :: c
end subroutine add_
end interface
integer(c_int) :: x, y, z
x = 2; y = 3
call add_(x, y, z)
print *, "Fortran got: ", z
end program main
- 编译:gcc -c add.c -o add.o && gfortran -c main.f90 -o main.o && gfortran main.o add.o -o app
远程开发与调试建议
- 远程 GUI 开发:
- 在服务器启用桌面后,使用 x11vnc 或 X2Go 远程桌面;本地用 VNC 客户端或 X2Go 客户端连接。
- IDE 与语言服务器:
- 本地安装 VS Code,通过 Remote - SSH 连接服务器;安装 fortls(pip install fortran-language-server),在 VS Code 中配置 Language Server,获得自动补全、跳转、诊断等体验。
- 调试:
- 安装 gdb:sudo yum install gdb -y;调试命令:gdb ./your_app
- 常见问题排查:
- 链接失败优先检查 pkg-config 输出是否包含正确的头文件与库路径;必要时手动补充 -I/-L/-l。
- 运行报错找不到共享库时,确认库已安装并在 /etc/ld.so.conf.d/ 配置路径后执行 ldconfig。
以上路径覆盖了在 CentOS 上用 Fortran 做 GUI 的主流做法:优先选择 gtk-fortran/FLTK 等原生绑定;若追求复杂界面与生态,采用 Qt/GTK + Fortran 混合编程 更稳妥;远程开发建议配合 VS Code + fortls 提升效率。