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
相关产品推荐
相关产品推荐

