我没有~/.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
的默认行为。
我的会话信息:
> 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
答案 0 :(得分:0)
我仍然不知道如何使用Makevars
来做我想要的,基本上是这样的:
make
导出文件,通过Build and Reload
包在Rstudio(Windows 7)中执行正常默认Rcpp
。在引擎盖下,这将调用Rcpp::compileAttributes()
然后继续运行其他包构建命令。make
执行另一个Build and Reload
,但现在只读取仅编译Makefile
代码的TMB
。然而,我确实有一个解决方法。基本上,R extensions manual表示:
可以使用以下`src / install.libs.R'复制接近默认行为的东西。文件:
...
因为编译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
到软件包的安装目录。
注意,it is possible, but possibly very difficult使用Makevars
在TMB文件存储在子目录中时完成编译。 Dirk推荐matrix package中的示例,但我没有运气修改那里的代码来做我想做的事。