external - 在 Fortran 中为 Lapack 使用显式接口:链接查找模块文件失败
问题描述
问题
为Lapack添加外部接口后,与消息链接时代码失败
Undefined symbols for architecture x86_64:
"___msolutionsvd_MOD_dgesvd", referenced from:
___msolutionsvd_MOD_svd_pseudoinverse_solve_sub in m-solution-svd.o
似乎链接器正在寻找我的安装DGESVD.mod
中未包含的文件。openblas
代码
这有效
模块module mSolutionSVD
使用了声明
external DGESVD
指向 BLAS 例程并contains
subroutine svd_pseudoinverse_solve_sub
调用DGESVD
.
这失败了
声明被显式接口替换
interface lapack
module subroutine DGESVD ( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, INFO )
character ( kind = kindA, len = 1 ), intent ( in ) :: JOBU, JOBVT
integer ( kind = ip ), intent ( in ) :: M, N, LDA, LDU, LWORK
integer ( kind = ip ), intent ( out ) :: INFO
real ( kind = rp ), intent ( out ) :: S ( : ), U ( : , : ), VT ( : , : ), WORK ( : )
real ( kind = rp ), intent ( inout ) :: A ( : , : )
end subroutine DGESVD
end interface lapack
背景
kind 语句来自具有以下语句的例程:
use, intrinsic :: iso_fortran_env, only : INT8, REAL64
integer, parameter :: kindA = kind ( 'A' )
integer, parameter :: rp = selected_real_kind ( REAL64 )
integer, parameter :: ip = selected_int_kind ( INT64 )
问题
我们可以为 Lapack 使用外部接口而无需重新编译 Lapack 吗?
解决方案
您的代码存在三个问题,其中两个与您的问题无关。
首先,数据类型的定义应该是
use, intrinsic :: iso_fortran_env, only : INT64, REAL64
integer, parameter :: kindA = kind ( 'A' )
integer, parameter :: rp = REAL64
integer, parameter :: ip = INT64
这是因为预定义的常量已经代表了行列,而辅助函数INT64
期望得到有效的小数位数。REAL64
selected_*_kind
其次,你的界面没有指定参数LDVT
。
第三,也是最重要的,您声明DGESVD
为 a module subroutine
,通过它您说子例程位于当前模块中。但事实并非如此。Lapack 子程序不在任何模块中。因此,您需要module
从接口定义中省略关键字。
注意:如果数据类型kindA
,rp
和ip
定义在同一个模块中,那么在module
从接口声明中删除关键字后,您还需要添加该行
import kindA, ip, rp
就在原型线下方subroutine DGESVD (...
推荐阅读
- python - 从 Pandas 数据框创建 docx 文件的嵌套循环
- database - errmsg" : "无法从 BSON 类型字符串转换为日期
- asp.net - 类型的成员“Column1”在数据读取器中没有同名的对应列
- c - c结构如何循环?为什么变量没有在程序的位置(2)处赋值?它只打印在位置 (1)?
- winapi - 指向 IFileOperation::DeleteItems 方法的 IShellItemArray 的 IUnknown 的指针
- python - 减少 XML 文件编程的代码长度 (Python)
- python-3.x - 如何从每个第一个非 NaN 值中过滤数据框,直到下一个并从相应列中求和值?
- angular - 具有动态 ID 的默认路由
- java - 使用 json-simple-1.1.1.jar 运行 Java 文件的终端命令
- apache-spark - Spark-submit 在 HTTP 代理后面时无法解析 --package 依赖项