2

我在 /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 MyTMBTMB::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

4

0 回答 0