首页 > 解决方案 > 使用 f2py 包装 fortran 代码时是否可以使用静态链接?

问题描述

正如我在上一个问题中所讨论的,我正在尝试在远程服务器上运行一个使用 f2py 包装的 Fortran 代码的 python 脚本。如果我在自己的电脑上本地编译 f2py 模块,然后在服务器上运行脚本,我会收到以下错误,

ImportError:liblapack.so.3:无法打开共享对象文件:没有这样的文件或目录

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

避免这种情况的一种方法(可以在二进制页面上找到更多想法)是使用所谓的“静态链接”,可通过 option 获得-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 调用中,但这只会给出未知选项错误。

标签: pythonfortrangfortranf2py

解决方案


是的,如果您使用from with ,这在setup.py脚本中是可能的。Extensionnumpy.distutils.coreextra_link_args=["-static", "-static-libgfortran", "-static-libgcc"]

此答案中对此进行了解释。


推荐阅读