init.cpp
принимает методы регистрации, а Makevars
запрещает компиляцию файлов cpp
.Со следующими изменениями в Makevars
(и Makevars.win
) я получил его для компиляции:
diff --git a/src/Makevars b/src/Makevars
index 7aedc5b..3ea312e 100644
--- a/src/Makevars
+++ b/src/Makevars
@@ -1,8 +1,9 @@
STANHEADERS_SRC = `"$(R_HOME)/bin$(R_ARCH_BIN)/Rscript" --vanilla -e "cat(system.file('include', 'src', package = 'StanHeaders'))"`
PKG_CPPFLAGS = -I"../inst/include" -I"$(STANHEADERS_SRC)" -DBOOST_RESULT_OF_USE_TR1 -DBOOST_NO_DECLTYPE -DBOOST_DISABLE_ASSERTS -DEIGEN_NO_DEBUG -DBOOST_MATH_OVERFLOW_ERROR_POLICY=errno_on_error
-SOURCES = $(wildcard stan_files/*.stan)
-OBJECTS = $(SOURCES:.stan=.o) init.o
+CPP_SOURCES = $(wildcard *.cpp)
+STAN_SOURCES = $(wildcard stan_files/*.stan)
+OBJECTS = $(STAN_SOURCES:.stan=.o) $(CPP_SOURCES:.cpp=.o)
all: $(SHLIB)
@if test -e "/usr/bin/install_name_tool" && test -e "/usr/local/clang4/lib/libc++.1.dylib" && test -e "/usr/lib/libc++.1.dylib"; then /usr/bin/install_name_tool -change /usr/local/clang4/lib/libc++.1.dylib /usr/lib/libc++.1.dylib $(SHLIB); fi
После вызова Rcpp::compileAttributes()
регистрация метода снова присутствовала в RcppExports.cpp
.Когда я попробовал R CMD INSTALL
, я получил ошибку от .onLoad()
, ср https://github.com/stan-dev/rstanarm/issues/190. Использование обходного пути, то есть R CMD INSTALL --preclean
сначала решило проблему, но не было надежным.Что решило проблему для меня, так это изменить
R_useDynamicSymbols(dll, FALSE);
на
R_useDynamicSymbols(dll, TRUE);
в RcppExports.cpp
.Это, конечно, проблематично, поскольку этот файл может быть перезаписан, в частности, когда используется RStudio / devtools.Довольно хакерским решением было бы добавить
RcppExports.o: patch
patch:
sed -i 's/R_useDynamicSymbols(dll, FALSE)/R_useDynamicSymbols(dll, TRUE)/' RcppExports.cpp
.phony: all clean patch
в Makevars(.win)
.Но, в конце концов, проблема заключается в том, что код C ++ для модулей Rcpp генерируется во время установки пакета в подкаталоге src
.Поэтому Rcpp::compileAttributes()
не может включить соответствующие метофы в список зарегистрированных методов.Я не вижу хорошего решения для этого.Теперь пакет собирается, проверяется и устанавливается с двумя примечаниями:
N checking installed package size
installed size is 7.8Mb
sub-directories of 1Mb or more:
libs 7.7Mb
N checking for GNU extensions in Makefiles
GNU make is a SystemRequirements.