我在/ src中有9个cpp文件 - 来自Rcpp的8个文件和来自TMB的1个cpp文件。我可以编译所有并成功运行代码或通过CRAN检查。但不是两个。
方法1
让R编译所有cpp文件并生成一个DLL:' mypackage.dll'和TMB::MakeADfun(..., DLL="mypackage")
:
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"
方法2
使用' makevars.win'在this suggestion之后,添加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
devtools :: check()会为每个Rcpp函数生成一个警告:
checking foreign function calls ... WARNING
Foreign function calls to a different package:
.Call("_rcppfunction1", ..., PACKAGE = "mypackage")
libs
子目录超过30 Mb,大约是方法1的两倍。Rcpp开发人员推荐not to use a makevars file,显然我会覆盖Rcpp中的某些内容,导致外部函数调用'问题,即使包是当前包。看来我的选择是:
有什么建议吗?
R详情:
平台x86_64-w64-mingw32
拱x86_64
os mingw32
system x86_64,mingw32
状态
专业3
未成年人3.3