Windows10下Rcpp::sourceCpp生成Debug DLL及相关配置问题咨询
问题与解答
问题背景
适用于Windows 10系统,使用Rcpp::sourceCpp编译C++函数并指定目录跟踪代码修改,遇到以下问题:
- 设置
windowsDebugDLL=TRUE后仍生成优化代码,Debug构建未生效 - 不清楚链接时
-lR对应的库文件,搜索libR.lib/libR.a/R.lib/R.a均未找到 - 编译所用的R Makefile位置,是否为临时生成后即被删除
- Windows下
Makevars/Makevars.win的正确位置,放在用户目录.R文件夹无效,确认能否生成Debug版本DLL
编译输出详情
Rcpp::sourceCpp("sfgkanal.cpp", verbose=TRUE, rebuild=FALSE, cacheDir = getwd(), windowsDebugDLL=TRUE) Generated extern "C" functions -------------------------------------------------------- #include <Rcpp.h> #ifdef RCPP_USE_GLOBAL_ROSTREAM Rcpp::Rostream<true>& Rcpp::Rcout = Rcpp::Rcpp_cout_get(); Rcpp::Rostream<false>& Rcpp::Rcerr = Rcpp::Rcpp_cerr_get(); #endif // analyseSFGK Rcpp::List analyseSFGK(Rcpp::List& x); RcppExport SEXP sourceCpp_1_analyseSFGK(SEXP xSEXP) { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; Rcpp::traits::input_parameter< Rcpp::List& >::type x(xSEXP); rcpp_result_gen = Rcpp::wrap(analyseSFGK(x)); return rcpp_result_gen; END_RCPP } // libraryReady Rcpp::String libraryReady(); RcppExport SEXP sourceCpp_1_libraryReady() { BEGIN_RCPP Rcpp::RObject rcpp_result_gen; Rcpp::RNGScope rcpp_rngScope_gen; rcpp_result_gen = Rcpp::wrap(libraryReady()); return rcpp_result_gen; END_RCPP } Generated R functions ------------------------------------------------------- `.sourceCpp_1_DLLInfo` <- dyn.load('H:/jupyter-mktmicro-research/R/sfgk/sourceCpp-x86_64-w64-mingw32-1.0.9/sourcecpp_69f04dc58d9/sourceCpp_19.dll') analyseSFGK <- Rcpp:::sourceCppFunction(function(x) {}, FALSE, `.sourceCpp_1_DLLInfo`, 'sourceCpp_1_analyseSFGK') libraryReady <- Rcpp:::sourceCppFunction(function() {}, FALSE, `.sourceCpp_1_DLLInfo`, 'sourceCpp_1_libraryReady') rm(`.sourceCpp_1_DLLInfo`) Building shared library -------------------------------------------------------- DIR: H:/jupyter-mktmicro-research/R/sfgk/sourceCpp-x86_64-w64-mingw32-1.0.9/sourcecpp_69f04dc58d9 C:/PROGRA~1/R/R-42~1.0/bin/x64/R CMD SHLIB -d --preclean -o "sourceCpp_19.dll" "sfgkanal.cpp" g++ -std=gnu++11 -I"C:/PROGRA~1/R/R-42~1.0/include" -DNDEBUG -I"C:/Users/.../AppData/Local/R/win-library/4.2/Rcpp/include" -I"H:/jupyter-mktmicro-research/R/sfgk" -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -gdwarf-2 -mfpmath=sse -msse2 -mstackrealign -c sfgkanal.cpp -o sfgkanal.o In file included from C:/Users/.../AppData/Local/R/win-library/4.2/Rcpp/include/Rcpp/Vector.h:54, from C:/Users/.../AppData/Local/R/win-library/4.2/Rcpp/include/Rcpp.h:40, from sfgkanal.cpp:1: C:/Users/.../AppData/Local/R/win-library/4.2/Rcpp/include/Rcpp/vector/traits.h: In lambda function: C:/Users/.../AppData/Local/R/win-library/4.2/Rcpp/include/Rcpp/vector/traits.h:49:47: warning: '*((void*)(&<anonymous>)+16).Rcpp::traits::r_vector_cache<13, Rcpp::PreserveStorage>::start' may be used uninitialized in this function [-Wmaybe-uninitialized] 49 | inline proxy ref(R_xlen_t i) const { return start[i] ; } | ^~~~~ C:/Users/.../AppData/Local/R/win-library/4.2/Rcpp/include/Rcpp/vector/traits.h:49:47: warning: '*((void*)(&<anonymous>)+16).Rcpp::traits::r_vector_cache<13, Rcpp::PreserveStorage>::start' may be used uninitialized in this function [-Wmaybe-uninitialized] 49 | inline proxy ref(R_xlen_t i) const { return start[i] ; } | ^~~~~ C:/Users/.../AppData/Local/R/win-library/4.2/Rcpp/include/Rcpp/vector/traits.h:49:47: warning: '*((void*)(&<anonymous>)+16).Rcpp::traits::r_vector_cache<13, Rcpp::PreserveStorage>::start' may be used uninitialized in this function [-Wmaybe-uninitialized] 49 | inline proxy ref(R_xlen_t i) const { return start[i] ; } | ^~~~~ C:/Users/.../AppData/Local/R/win-library/4.2/Rcpp/include/Rcpp/vector/traits.h:49:47: warning: '*((void*)(&<anonymous>)+16).Rcpp::traits::r_vector_cache<13, Rcpp::PreserveStorage>::start' may be used uninitialized in this function [-Wmaybe-uninitialized] 49 | inline proxy ref(R_xlen_t i) const { return start[i] ; } | ^~~~~ g++ -std=gnu++11 -shared -static-libgcc -o sourceCpp_19.dll tmp.def sfgkanal.o -LC:/rtools42/x86_64-w64-mingw32.static.posix/lib/x64 -LC:/rtools42/x86_64-w64-mingw32.static.posix/lib -LC:/PROGRA~1/R/R-42~1.0/bin/x64 -lR
问题解答
1. windowsDebugDLL=TRUE无效,仍生成优化代码
从编译输出可见,g++参数包含-O2(二级优化)和-DNDEBUG(禁用调试宏),说明windowsDebugDLL=TRUE未正确覆盖默认编译参数。解决方法:
- 强制覆盖编译参数,在
sourceCpp调用中添加cppflags="-O0 -UNDEBUG -gdwarf-2",并设置rebuild=TRUE(避免复用缓存):Rcpp::sourceCpp("sfgkanal.cpp", verbose=TRUE, rebuild=TRUE, cacheDir = getwd(), windowsDebugDLL=TRUE, cppflags="-O0 -UNDEBUG -gdwarf-2")
2. -lR链接的是哪个库?
在Windows MinGW环境下,-lR实际链接的是R.dll,位于C:/PROGRA~1/R/R-42~1.0/bin/x64/。MinGW链接器会自动在-L指定的路径中查找lib<name>.a或<name>.dll,R在Windows下仅提供动态链接库R.dll,无需对应的静态库文件。
3. R编译用的Makefile位置?
使用R CMD SHLIB时,会在编译目录(即输出中的DIR路径:H:/jupyter-mktmicro-research/R/sfgk/sourceCpp-x86_64-w64-mingw32-1.0.9/sourcecpp_69f04dc58d9/)临时生成Makefile,编译完成后不会自动删除,可直接前往该目录查看。
4. Windows下Makevars文件位置及Debug DLL生成
Windows下Makevars.win的正确位置:
- 用户级:
C:/Users/<你的用户名>/Documents/.R/Makevars.win(注意是Documents文件夹下的.R目录,不是用户根目录的.R) - 项目级:直接放在代码目录(
H:/jupyter-mktmicro-research/R/sfgk/)下,命名为Makevars.win
要生成Debug DLL,可在Makevars.win中添加以下内容,再重新调用sourceCpp并设置rebuild=TRUE:
CXXFLAGS += -O0 -UNDEBUG -gdwarf-2
确认Rtools版本与R版本匹配(你当前使用R-4.2.0对应Rtools42,路径已正确配置),即可生成Debug版本DLL。
内容的提问来源于stack exchange,提问作者Ramesh Kadambi
相关产品推荐
相关产品推荐

