Linux下Fortran编译及调用动态链接库
0. 应用背景
在科学计算与工程开发的漫长历程中,Fortran语言作为早期科学计算程序的主力工具,承载着众多关键应用的核心算法。随着计算需求的不断演进,直接修改原始Fortran代码以适应现代开发流程的难度日益增大。一方面,早期Fortran代码往往结构复杂、缺乏现代软件工程实践中的模块化设计,直接修改容易引发错误且维护成本高昂;另一方面,大量遗留代码需要在不改变其核心逻辑的前提下进行功能扩展和性能优化。
在此背景下,将Fortran代码封装为动态链接库并进行调用成为一种极具可行性的解决方案。通过将经过验证的Fortran计算核心封装为动态链接库,开发人员可以在保留原有代码优势的同时,方便地在多种应用程序和开发环境中复用这些功能模块。这种做法不仅降低了对原始代码的依赖和修改风险,还能够充分利用现代操作系统对动态链接库的高效支持,实现跨语言、跨平台的灵活调用。例如,在大型工程仿真软件中,可以将Fortran编写的物理模型计算部分封装为动态链接库,然后在C++编写的图形用户界面程序中进行调用,从而结合两者的优势,快速构建功能完备的现代工程应用。
1. 技术要点:
1, 使用关键字“subroutine” 标识 子程序主函数:
2, 配置makefile 脚本,将目标文件设置为libmylib.so(“lib”开头、“.so”结束), 同时在编译器处增加 “-shared”指令;
3, 编写主程序,使用interface指令引入 动态库函数,call 方法调用
4, 在编译主程序时,通过 -L 指定动态库路径,-l 指定动态库名称(掐头去尾)
2. 示例代码
2.1 动态库源文件示例
编写动态库源文件mylib.f90
subroutine my_subroutine(x, y)
implicit none
integer, intent(in) :: x
integer, intent(out) :: y
y = x * 2
end subroutine my_subroutine
2.2 编译Makefile文件(编译动态库)
# 定义变量
CC = gfortran
LIB = libmylib.so
OBJS = mylib.o
# 编译动态链接库
all: $(LIB)
$(LIB): $(OBJS)
$(CC) -shared -fPIC -o $@ $^
mylib.o: mylib.f90
$(CC) -fPIC -c $< -o $@
# 清理
clean:
rm -f $(OBJS) $(LIB)
2.3 运行make命令,生成libmylib.so 文件
2.4 编写主程序main.f90
使用interface指令引入动态链接库函数,
program main
implicit none
integer :: result
! 声明外部子程序接口
interface
subroutine my_subroutine(x, y)
integer, intent(in) :: x
integer, intent(out) :: y
end subroutine my_subroutine
end interface
! 调用动态链接库中的子程序
call my_subroutine(5, result)
print *, 'Result:', result
end program main
2.5 编写Makefile文件(编译主程序)
# 定义变量
CC = gfortran
LIB = libmylib.so
OBJS = mylib.o
TARGET = main
# 编译目标程序
all: $(TARGET)
$(TARGET): main.o $(LIB)
$(CC) -o $@ $^ -L. -lmylib
main.o: main.f90
$(CC) -c $< -o $@
# 编译动态链接库
$(LIB): $(OBJS)
$(CC) -shared -fPIC -o $@ $^
mylib.o: mylib.f90
$(CC) -fPIC -c $< -o $@
# 清理
clean:
rm -f $(OBJS) $(LIB) main.o $(TARGET)
注:使用 -L. 表示库文件在当前目录下,-lmylib 表示链接库 libmylib.so(掐头去尾)
3. 总结
在 Linux 下使用 Fortran 编译及调用动态链接库,是一种高效且灵活的开发方式。通过将 Fortran 编写的高性能计算模块编译为动态链接库,可以在多个程序中共享使用,提高代码的复用性和维护性。同时,动态链接库支持跨语言调用,使得 Fortran 编写的模块可以被其他语言(如 C、Python 等)调用,扩展了 Fortran 的应用范围。此外,动态链接库的动态加载特性允许程序在运行时按需加载和更新模块,减少了内存占用,提高了系统的资源利用效率。

1199

被折叠的 条评论
为什么被折叠?



