使用 f2py 包装 fortran 代码时是否可以使用静态链接?

问题描述

正如我在之前的 question 中所讨论的,我试图在远程服务器上运行一个使用 f2py 包装的 Fortran 代码的 python 脚本。如果我在自己的电脑上本地编译 f2py 模块,然后在服务器上运行该脚本,则会出现以下错误

导入错误:liblapack.so.3:无法打开共享对象文件:没有那个文件或目录

这是合乎逻辑的,因为 lapack 和 blas 都没有安装在远程服务器上,遗憾的是我没有安装它们的 root 权限。我想知道是否可以通过使用静态链接解决这个问题。在 GNU wiki 上声明,

避免这种情况的一种方法(更多想法可以在二进制文件页面上找到)是使用所谓的“静态链接”,可通过选项 -static 获得。然后 Gfortran 将库代码放入创建的程序中,从而使其能够在没有库的情况下运行(例如,在未安装 gfortran 的计算机上)。

这听起来正是我所需要的。如果所需的库文件包含在 f2py 模块中,那么我将不需要远程服务器上的 lapack 和 blas 模块,我可以按原样运行它。但是我不确定这个静态链接是否真的适用于 f2py。目前我在跑步,

python -m numpy.f2py -llapack -lblas -c --fcompiler=gnu95 --compiler=unix signature_file.pyf 
object_files.o

object_files.o 表示编译成目标文件的所有相互依赖的 Fortran 文件,即我跑了

gfortran -c -llapack -lblas object_file.F90 

在所有相关文件上。现在我想用静态链接来做到这一点,但是怎么做?我尝试在编译目标文件添加 -static ,但这并没有改变任何东西。我也尝试将 -static 添加到 f2py 调用中,但这只是给出了一个未知的选项错误

解决方法

是的,如果您将 setup.py 中的 Extensionnumpy.distutils.core 一起使用,这在 extra_link_args=["-static","-static-libgfortran","-static-libgcc"] 脚本中是可能的。

this answer中有解释。