python - 使用 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 调用中,但这只会给出未知选项错误。
解决方案
是的,如果您使用from with ,这在setup.py
脚本中是可能的。Extension
numpy.distutils.core
extra_link_args=["-static", "-static-libgfortran", "-static-libgcc"]
此答案中对此进行了解释。
推荐阅读
- javascript - 渲染不同组件时无法更新组件 [React JS]
- amazon-web-services - AWS::Lambda::EventSourceMapping LambdaTrigger UPDATE_FAILED
- python - 如何与网页中的元素进行交互
- ios - SwiftUI NavigationView 在 iOS 15 上立即自行弹出视图
- python - 使用 Python 检查 JSON 响应的验证
- gitlab - Gitlab Helmchart 磁盘大小配置
- apple-push-notifications - 为两个不同的 AWS pinpoint 实例使用一个 APNS 推送服务证书
- python - Python中的交互式矩阵输入(类似于R Shiny中的shinyMatrix)
- swift - 同一表格视图中具有不同高度的两个不同单元格RXSwift
- winapi - 如何获得监视器重新激活的通知?再次打开监视器时,我没有收到 WM_SYSCOMMAND 消息