我没有~/.R/Makevars文件,并且

> tools::makevars_user()
character(0)
> tools::makevars_site()
character(0)

但是,R必须从某处读取配置,因为在.cpp子目录包中包含Rcpp导出的src文件可以正常编译。

我有兴趣知道如何在Makefile.win目录中编写src,以便Rcpp文件与TMB .cpp文件一起继续编译。当前一个makefile像:
all: fn1.dll fn2.dll

fn1.dll: fn1.cpp
    Rscript --vanilla -e "TMB::compile('fn1.cpp')"

fn2.dll: fn2.cpp
    Rscript --vanilla -e "TMB::compile('fn2.cpp')"

clean:
    rm -rf *o

可以很好地编译TMB文件,实际上由以下建议:https://github.com/kaskr/adcomp/issues/43

我试图修改Dirk here建议的makefile,但是即使使用了新的测试包也无法复制R的默认行为。

我的 session 信息:
> sessionInfo()
R version 3.3.2 (2016-10-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

最佳答案

我仍然不知道如何使用Makevars来完成我想要的事情,这实际上是:

  • 通过make包在Rstudio(Windows 7)中为所有Build and Reload导出文件执行正常的默认Rcpp。在后台,这将调用Rcpp::compileAttributes(),然后继续运行其他程序包构建命令。
  • 使用Rstudio make执行另一个Build and Reload,除了现在它读取仅编译Makefile代码的TMB

  • 但是,我确实有一种解决方法。本质上,R extensions manual指出:



    由于编译TMB .cpp文件的代码只是R命令,因此很容易将它们集成到这样的文件中:
    # replicate default R
    files <- Sys.glob(paste("*", SHLIB_EXT, sep=''))
    libarch <- if (nzchar(R_ARCH)) paste('libs', R_ARCH, sep='') else 'libs'
    dest <- file.path(R_PACKAGE_DIR, libarch)
    dir.create(dest, recursive = TRUE, showWarnings = FALSE)
    file.copy(files, dest, overwrite = TRUE)
    
    # now do TMB files
    cpp_files <- list.files('./TMB/', full.names = T, pattern = '*.cpp')
    
    for (f in cpp_files) {
        TMB::compile(f)
    }
    
    files <- Sys.glob(paste("./TMB/*", SHLIB_EXT, sep=''))
    libarch <- if (nzchar(R_ARCH)) paste('libs', R_ARCH, sep='') else 'libs'
    dest <- file.path(R_PACKAGE_DIR, libarch)
    dir.create(dest, recursive = TRUE, showWarnings = FALSE)
    file.copy(files, dest, overwrite = TRUE)
    

    此文件读取并编译存储在子目录TMP中的所有.cpp类型<pkgdir>/src/TMB文件,然后将.dll<pkgdir>/src/中的所有后续<pkgdir>/src/TMB复制到软件包的安装目录中。

    注意,当TMB文件存储在子目录中时,it is possible, but possibly very difficult使用Makevars完成编译。 Dirk在matrix package中推荐了该示例,但是我没有运气修改其中的代码以执行我想要的操作。

    关于c++ - 如何查看和复制R默认的Makevars配置?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46883786/

    10-12 17:54