我在 /src 中有 9 个 cpp 文件 - 8 个来自 Rcpp,1 个来自 TMB。我可以编译所有代码并成功运行代码,或者通过 CRAN 检查。但不是两者兼而有之。
方法一
让 R 编译所有 cpp 文件并生成单个 DLL:“mypackage.dll”和TMB::MakeADfun(..., DLL="mypackage")
:
- 通过所有 CRAN 检查(除了安装包大小的注释,见下文)。
- Rcpp 函数工作正常
- 调用 TMB 函数会导致:
Error in .Call("getParameterOrder", data, parameters, new.env(), PACKAGE = DLL) : "getParameterOrder" not available for .Call() for package "mypackage"
- 使用
TMB::MakeADFun(..., DLL="mypackage", checkParameterOrder=FALSE)
结果:Error in .Call("TMBconfig", e, as.integer(1), PACKAGE = DLL) : "TMBconfig" not available for .Call() for package "mypackage"
方法二
按照这个建议使用 'makevars.win' ,添加useDynLib MyTMB
并TMB::MakeADfun(..., DLL="MyTMB")
创建两个 DLL(mypackage.dll 和 MyTMB.dll):
makevars.win:
all: MyTMB.dll
MyTMB.dll: MyTMB.cpp
$(R_HOME)/bin$(R_ARCH_BIN)/Rscript --vanilla -e "TMB::compile('MyTMB.cpp', safebounds=FALSE, safeunload=FALSE)"
clean:
rm -rf *o
- Rcpp 和 TMB 功能都有效
devtools::check() 会对每个 Rcpp 函数产生一个警告:
checking foreign function calls ... WARNING Foreign function calls to a different package: .Call("_rcppfunction1", ..., PACKAGE = "mypackage")
- 和一个关于大安装包大小的注释。
libs
子目录超过 30 Mb,大约是方法 1 的两倍。
Rcpp 开发人员建议不要使用 makevars 文件,显然我正在覆盖 Rcpp 中的某些内容以导致“外部函数调用”问题,即使该包是当前包。看来我的选择是:
- 修改“makevars”以恢复避免警告的 Rcpp 默认值,并恳求 CRAN 接受有关已安装包大小的说明。不知道如何做前者。
- 找到解决方法 1 问题的方法,并请求安装较小的包大小。将是只有一个 dll 的最简单的解决方案。不确定问题是否是因为我同时编译 Rcpp 和 TMB 而引起的,如果是,如何解决。
- 或其他我想念的东西。
有什么建议么?
详细信息:
平台 x86_64-w64-mingw32
arch x86_64
os mingw32
system x86_64, mingw32
status
major 3
minor 3.3