linux下如何指定python和fortran要使用的外部库

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)位置。

头文件的搜索顺序:

  1. 由参数 -I指定的路径
  2. 找gcc的环境变量C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH,gfortran不适用任何环境变量来控制影响gcc操作的环境。
  3. 寻找内定目录:
    /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

库文件的搜索顺序:

  1. 由参数 -L指定的路径
  2. 找gfortran的环境变量LIBRARY_PATH
  3. 找内定目录
    /lib
    /usr/lib
    /usr/local/lib 4

动态库文件的搜索顺序:

  1. 编译目标代码 -I时指定的动态库搜索路径;
  2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
  3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
  4. 默认的动态库搜索路径/lib /usr/lib4

3.gfortran如何引入外部库netcdf

假设netcdf安装的目录为prefix,该目录底下有/bin存放操作命令(ncdump),/include存放头文件,/lib存放库文件。

指定netcdf头文件

  1. 使用命令行参数-I pathlib(推荐)
    gfortran t_main.f90 -I prefix/include
    在t_main.f90中include netcdf.inc
  2. 将头文件夹拷贝到内定目录
  3. 在makefile中指定

指定netcdf动态库文件

  1. 使用命令行参数-It/-WI,-rpath
    gfortran -WI,-rpath,prefix/lib,XXX/lib
    可以指定多个库
  2. 添加到动态库文件环境变量(推荐)
    加入到LD_LIBRARY_PATH中
    export LD_LIBRARY_PATH=prefix/lib:${LD_LIBRARY_PATH}
  3. 在配置文件/etc/ld.so.conf中指定动态库路径
    每行为一个路径,每次编辑完后,需运行ldconfig使配置生效,具体见3

4.python如何引入外部库netcdf

设置环境变量PYTHONPATH:
export PYTHONPATH=prefix:${PYTHONPATH}
将这句命令添加到~/.bashrc中,并允许source ~/.bashrc更新设置。


  1. https://blog.csdn.net/liang13664759/article/details/1771246 ↩︎

  2. http://wap.sciencenet.cn/blog-725052-1146332.html ↩︎

  3. https://www.cnblogs.com/xzzzh/p/6770306.html ↩︎ ↩︎ ↩︎

  4. https://cnblogs.com/sunleecn/archieve/2011/11/04/2235770.html ↩︎ ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值