在R中调用依赖LAPACK的Fortran子程序的问题与解决方法
在Windows 11 + R 4.1环境下解决调用LAPACK编译动态链接库报错的问题
问题场景
原本可通过R CMD SHLIB编译Fortran文件生成动态链接库,再用dyn.load()和.Fortran()调用其中的子程序,但当代码中使用LAPACK函数时,添加-llapack参数编译会报错找不到库。
解决方案
以下是针对该环境的完整解决步骤:
1. 设置路径
- 切换工作目录到你的项目路径:
setwd("D:/your_project_path") # 替换为实际项目路径 - 找到R自带的LAPACK库路径,通常位于R安装目录的
lib/x64下(例如C:/Program Files/R/R-4.1.3/lib/x64),后续编译会用到该路径。
2. 编写调用LAPACK的Fortran子程序
以调用LAPACK的dgeev(计算矩阵特征值)为例,编写dgeev_example.f文件:
subroutine dgeev_example(n, a, wr, wi) implicit none ! 输入输出变量声明 integer n double precision a(n,n), wr(n), wi(n) ! 声明LAPACK函数 external dgeev ! 辅助变量 integer lda, info, lwork double precision work(1000) character*1 jobvl, jobvr ! 设置参数:不计算左/右特征向量 jobvl = 'N' jobvr = 'N' lda = n lwork = 1000 ! 调用LAPACK的dgeev函数 call dgeev(jobvl, jobvr, n, a, lda, wr, wi, & 0, 1, 0, 1, work, lwork, info) end
3. 用gfortran编译生成动态链接库
打开命令提示符(CMD),切换到项目路径后执行以下编译命令(替换R安装路径为你的实际路径):
gfortran -shared -o dgeev_example.dll dgeev_example.f -L"C:/Program Files/R/R-4.1.3/lib/x64" -llapack -lblas
-shared:生成动态链接库-L:指定库文件的搜索路径-llapack和-lblas:链接R自带的LAPACK和BLAS库
4. 在R中加载并调用编译好的库
# 加载动态链接库 dyn.load("dgeev_example.dll") # 准备测试数据:2x2矩阵 n <- 2 a <- matrix(c(1.0, 2.0, 3.0, 4.0), nrow = n) wr <- numeric(n) # 存储特征值实部 wi <- numeric(n) # 存储特征值虚部 # 调用Fortran子程序 result <- .Fortran("dgeev_example", n = as.integer(n), a = as.double(a), wr = wr, wi = wi) # 输出结果 cat("特征值实部:", result$wr, "\n") cat("特征值虚部:", result$wi, "\n")
说明
Windows环境下R CMD SHLIB直接添加-llapack参数报错的原因是默认链接路径未包含R自带的LAPACK库位置,直接通过gfortran指定库路径和链接参数可绕过该问题。
内容的提问来源于stack exchange,提问作者Warlock1
相关产品推荐
相关产品推荐

