问题描述
正如我在之前的 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
中的 Extension
与 numpy.distutils.core
一起使用,这在 extra_link_args=["-static","-static-libgfortran","-static-libgcc"]
脚本中是可能的。
在this answer中有解释。