转自:http://blog.sciencenet.cn/blog-725052-1146332.html
Fortran 90增加了Module的功能,可用来替代common data,打包子程序。因此,一个方便使用的Fortran程序包应该尽量采用module的形式。那么如何使用已经写好的module呢,一个比较好的方式是将module编译为动态链接库。本文介绍在Linux环境下如何使用gfortran生成fortran的动态链接库,以及如何使用。
如何生成动态链接库:
假如已经有了若干module,写在不同的文件中。例如t_mod.f90(自定义类型,文件中定义module t),t_mod_sub.f90(相关子程序,文件中定义module t_sub),可按如下形式编译
gfortran -shared -fPIC -o libt.so t_mod.f90 t_mod_sub.f90
编译成功后会生成三个文件,libt.so,t.mod, t_sub.mod。其中libt.so即是动态链接库,t.mod, t_sub.mod是头文件。
如何使用动态链接库:
假如有一个t_main.f90,里面使用module t中的自定义类型和module t_sub中的子程序。
方式1:一步
gfortran -o t_main t_main.f90 (指定动态链接库) (指定头文件)
方式2:两步
gfortran -o t_main.o -c t_main.f90 (指定头文件)
gfortran -o t_main t_main.o (指定动态链接库)
如何指定动态链接库
方法1:显式指定文件(不推荐)
path_to_lib/libt.so
方法2:指定动态链接库所在路径
这时要使用命令行参数-lt,然后通过下面三种方式之一指定路径
方法2.1 显式(推荐)
使用命令行参数-Lpath_to_lib
方法2.2 隐式(推荐)
加入到环境变量LIBRARY_PATH中,如export LIBRARY_PATH=$LIBRARY_PATH:path_to_lib。推荐使用绝对路径
方法2.3 使用当前文件夹(不推荐)
当前文件夹默认为动态链接库搜索的路径,可将.so文件拷贝到当前文件夹。
如何指定头文件
方法:指定头文件路径
方法1 显式(推荐)
使用命令行参数-Ipath_to_lib
方法2 使用当前文件夹(不推荐)
将头文件拷贝到当前文件夹
运行前要保证系统可以找到动态链接库。
方法:指定动态链接库所在路径
方法1:使用环境变量LD_LIBRARY_PATH。用法同上(推荐)
方法2:使用当前文件夹(不推荐)
总结:
推荐的方式为
先编译为动态链接库
gfortran -shared -fPIC -o libt.so t_mod.f90 t_mod_sub.f90
将生成的.so文件和.mod文件分别拷贝到文件夹A和B下,将文件夹A加入到LIBRARY_PATH和LD_LIBRARY_PATH下。
然后使用动态链接库时
用-I文件夹B 指定头文件所在文件夹,用-llibname指定所用的动态链接库。
Note:
Linux下,-llibname对应的动态链接库应为liblibname.so。比如-lt寻找的是libt.so,而不是t.so。