文章目录
1.基础知识储备
Fortran文件运行步骤
Fortran运行文件时,第一步:将源文件(f.90)编译成中间代码文件即object file(.o),即编译过程(compile);第二步:将大量的中间代码文件合成执行文件,即链接过程(link)。编译时,编译器检测程序语法,函数,变量是否被声明。链接时,链接器会在所有的object文件中找寻函数的实现。1
动态链接库与静态链接库的打包和使用
Fortran90增加了module的功能,module里面可以定义许多subroutine和function,将module编译成动态链接库打包子程序是个很好的方法。
假设有若干module,写在不同文件中,例如t_main.f90,t_mod.f90,t_mod_sub.f90,可以按如下形式编译:
gfortran -shared -fPIC -o libt.so t_mod.f90 t_mod_sub.f90
也可以先编译再链接:
gfortran -o libt.o -c t_mod.f90 t_mod_sub.f90
gfortran -shared -fPIC -o libt.so t_mod.mod t_mod_sub.mod
编译成功后生成libt.so,t_mod.mod,t_mod_sub.mod,t_mod.o,t_mod_sub.o,其中libt.so即是动态链接库,t_mod.mod,t_mod_sub.mod是头文件。2
-
-fPIC参数声明链接库的代码段是可以共享的,
-
-shared参数声明编译为共享库。请注意这次我们编译的共享库的名字叫做 libt.so,这也是Linux共享库的一个命名的惯例了:后缀使用so,而名称使用libxxxx格式。3
要使用动态库:
gfortran -o t_main t_main.f90 -I libt.so
生成t_main的可执行文件。
也可以打包成静态链接库
ar rcs libt.o t_mod.o t_mod_sub.o
- c:创建库 s:创建目标索引 t:显示目标文件名称 v:显示目标文件时间大小的信息
要使用静态库:
gfortran -o t_main t_main.f90 -L libt.o
生成t_main的可执行文件。
2.gfortran的头文件库文件基础
gfortran编译时,编译器需找到头文件(.h/.mod)和库文件(.so/.o)位置。
头文件的搜索顺序:
- 由参数 -I指定的路径
- 找gcc的环境变量C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH,gfortran不适用任何环境变量来控制影响gcc操作的环境。
- 寻找内定目录:
/usr/include
/usr/local/include
/usr/lib/gcc-lib/i386-linux/2.95.2/include
/usr/lib/gcc-lib/i386-linux/2.95.2/…/…/…/…/include/g+±3
/usr/lib/gcc-lib/i386-linux/2.95.2/…/…/…/…/i386-linux/include
库文件,但是如果装gcc的时候,是有给定的prefix的话,那么就是
/usr/include
prefix/include
prefix/xxx-xxx-xxx-gnulibc/include
prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include 3
库文件的搜索顺序:
- 由参数 -L指定的路径
- 找gfortran的环境变量LIBRARY_PATH
- 找内定目录
/lib
/usr/lib
/usr/local/lib 4
动态库文件的搜索顺序:
- 编译目标代码 -I时指定的动态库搜索路径;
- 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
- 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
- 默认的动态库搜索路径/lib /usr/lib4
3.gfortran如何引入外部库netcdf
假设netcdf安装的目录为prefix,该目录底下有/bin存放操作命令(ncdump),/include存放头文件,/lib存放库文件。
指定netcdf头文件
- 使用命令行参数-I pathlib(推荐)
gfortran t_main.f90 -I prefix/include
在t_main.f90中include netcdf.inc - 将头文件夹拷贝到内定目录
- 在makefile中指定
指定netcdf动态库文件
- 使用命令行参数-It/-WI,-rpath
gfortran -WI,-rpath,prefix/lib,XXX/lib
可以指定多个库 - 添加到动态库文件环境变量(推荐)
加入到LD_LIBRARY_PATH中
export LD_LIBRARY_PATH=prefix/lib:${LD_LIBRARY_PATH}
- 在配置文件/etc/ld.so.conf中指定动态库路径
每行为一个路径,每次编辑完后,需运行ldconfig使配置生效,具体见3
4.python如何引入外部库netcdf
设置环境变量PYTHONPATH:
export PYTHONPATH=prefix:${PYTHONPATH}
将这句命令添加到~/.bashrc中,并允许source ~/.bashrc更新设置。