我没有~/.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()
,然后继续运行其他程序包构建命令。 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/