linux下gfortran 生成so文件

转自: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。

你可能感兴趣的:(Fortran)