You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R包Windows开发版检查失败:C++代码BLAS/LAPACK函数链接报错

R包Windows编译BLAS/LAPACK函数未定义引用问题

问题背景

和合作者开发R包,Mac本地执行devtools::check()无错误或警告,但通过devtools::check_win_devel()验证Windows兼容性时,出现C++代码无法生成DLL的安装错误,链接阶段提示dgemv_、dgemm_等BLAS/LAPACK函数未定义引用。尝试过本地构建提交,调整pkgbuild::build()的binary和compile_attributes参数后问题仍未解决。

错误日志

* installing *source* package ...
** using staged installation
** libs
using C++ compiler: 'g++.exe (GCC) 12.2.0'
g++ -std=gnu++17  -I"D:/RCompile/recent/R/include" -DNDEBUG  -I'D:/RCompile/CRANpkg/lib/4.4/Rcpp/include' -I'D:/RCompile/CRANpkg/lib/4.4/RcppArmadillo/include'   -I"d:/rtools43/x86_64-w64-mingw32.static.posix/include"     -pedantic -O2 -Wall  -mfpmath=sse -msse2 -mstackrealign  -c RcppExports.cpp -o RcppExports.o
g++ -std=gnu++17  -I"D:/RCompile/recent/R/include" -DNDEBUG  -I'D:/RCompile/CRANpkg/lib/4.4/Rcpp/include' -I'D:/RCompile/CRANpkg/lib/4.4/RcppArmadillo/include'   -I"d:/rtools43/x86_64-w64-mingw32.static.posix/include"     -pedantic -O2 -Wall  -mfpmath=sse -msse2 -mstackrealign  -c a019_old.cpp -o a019_old.o
g++ -std=gnu++17 -shared -s -static-libgcc -o evinf.dll tmp.def RcppExports.o a019_old.o -Ld:/rtools43/x86_64-w64-mingw32.static.posix/lib/x64 -Ld:/rtools43/x86_64-w64-mingw32.static.posix/lib -LD:/RCompile/recent/R/bin/x64 -lR
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text+0x201e): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text+0x23e1): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text+0x2f08): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text+0x30ef): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text+0x3967): undefined reference to `dtrtri_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text+0x49c2): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text+0x4d63): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0xd98): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0xf3b): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0x119b): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0x1489): undefined reference to `dgemm_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0x1593): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0x17ba): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0x1996): undefined reference to `dsyrk_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0x1cd9): undefined reference to `dgemm_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0x1de7): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0x1ec5): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text.hot+0x2364): undefined reference to `dsyrk_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text$_ZN4arma3MatIdEC1INS_2OpINS_3ColIdEENS_9op_htransEEES5_NS_10glue_timesEEERKNS_4GlueIT_T0_T1_EE[_ZN4arma3MatIdEC1INS_2OpINS_3ColIdEENS_9op_htransEEES5_NS_10glue_timesEEERKNS_4GlueIT_T0_T1_EE]+0x1a9): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text$_ZN4arma3MatIdEC1INS_2OpINS_3ColIdEENS_9op_htransEEES5_NS_10glue_timesEEERKNS_4GlueIT_T0_T1_EE[_ZN4arma3MatIdEC1INS_2OpINS_3ColIdEENS_9op_htransEEES5_NS_10glue_timesEEERKNS_4GlueIT_T0_T1_EE]+0x2be): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text$_ZN4arma10glue_times5applyIdLb0ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4_[_ZN4arma10glue_times5applyIdLb0ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4_]+0x1b5): undefined reference to `dgemm_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text$_ZN4arma10glue_times5applyIdLb0ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4_[_ZN4arma10glue_times5applyIdLb0ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4_]+0x33a): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text$_ZN4arma10glue_times5applyIdLb0ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4_[_ZN4arma10glue_times5applyIdLb0ELb0ELb1ENS_3MatIdEES3_EEvRNS2_IT_EERKT3_RKT4_S4_]+0x417): undefined reference to `dgemv_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text$_ZN4arma6auxlib9inv_sympdIdEEbRNS_3MatIT_EERb[_ZN4arma6auxlib9inv_sympdIdEEbRNS_3MatIT_EERb]+0x79): undefined reference to `dpotrf_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text$_ZN4arma6auxlib9inv_sympdIdEEbRNS_3MatIT_EERb[_ZN4arma6auxlib9inv_sympdIdEEbRNS_3MatIT_EERb]+0xa4): undefined reference to `dpotri_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text$_ZN4arma6auxlib3invIdEEbRNS_3MatIT_EE[_ZN4arma6auxlib3invIdEEbRNS_3MatIT_EE]+0x96): undefined reference to `dgetrf_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text$_ZN4arma6auxlib3invIdEEbRNS_3MatIT_EE[_ZN4arma6auxlib3invIdEEbRNS_3MatIT_EE]+0xf9): undefined reference to `dgetri_'
D:\rtools43\x86_64-w64-mingw32.static.posix\bin/ld.exe: a019_old.o:a019_old.cpp:(.text$_ZN4arma6auxlib3invIdEEbRNS_3MatIT_EE[_ZN4arma6auxlib3invIdEEbRNS_3MatIT_EE]+0x1ec): undefined reference to `dgetri_'
collect2.exe: error: ld returned 1 exit status
no DLL was created
ERROR: compilation failed for package 
* removing 'd:/RCompile/CRANguest/R-devel/lib/[...]'

解决方案

从日志可见,链接命令仅添加了-lR,但Windows环境下R的BLAS/LAPACK库需要显式链接,可通过以下方案解决:

方案1:配置src/Makevars.win文件

在包的src目录下创建或编辑Makevars.win,添加BLAS/LAPACK链接参数:

PKG_LIBS += $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

R会自动解析这些变量,指向Windows编译环境中的对应库文件。

方案2:确认RcppArmadillo配置正确性

若使用RcppArmadillo,需确保DESCRIPTION文件包含以下配置:

LinkingTo: Rcpp, RcppArmadillo
Imports: Rcpp

RcppArmadillo的默认配置会自动处理BLAS/LAPACK链接,但手动编写代码时仍需保证Makevars.win包含方案1中的参数。

方案3:强制链接R的BLAS/LAPACK库

直接在Makevars.win中指定链接R自带的BLAS和LAPACK库:

PKG_LIBS += -lRblas -lRlapack $(FLIBS)

方案4:验证构建命令参数

可尝试使用以下命令本地测试Windows构建(需安装RTools环境):

pkgbuild::build(binary = TRUE, compile_attributes = TRUE, args = "--no-multiarch")

验证方法

修改配置后,重新运行devtools::check_win_devel(),或使用rhub::check_for_win()进行快速Windows构建验证。

内容的提问来源于stack exchange,提问作者Doktorandahl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 11:28:09