Я скопировал код C ++ из TMB учебная страница
#include <TMB.hpp> // Links in the TMB libraries
template<class Type>
Type objective_function<Type>::operator() ()
{
DATA_VECTOR(x); // Data vector transmitted from R
PARAMETER(mu); // Parameter value transmitted from R
PARAMETER(sigma); //
Type f; // Declare the "objective function" (neg. log. likelihood)
f = -sum(dnorm(x,mu,sigma,true)); // Use R-style call to normal density
return f;
}
и сохранил как tutorial.cpp
, Затем я попытался скомпилировать его в соответствии с инструкциями и получил:
> compile("tutorial.cpp")
Error in compile("tutorial.cpp") : Compilation failed
In addition: Warning messages:
1: In readLines(file) : incomplete final line found on 'tutorial.cpp'
2: running command 'make -f ".../R/R-33~1.2/etc/x64/Makeconf" -f "C:/PROGRA~1/R/R-33~1.2/share/make/winshlib.mk" -f "...\AppData\Local\Temp\RtmpqgV7xA\file2d987ade32f3" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="tutorial.dll" WIN=64 TCLBIN=64 OBJECTS="tutorial.o"' had status 127
Кроме того, в окне редактора RStudio я вижу крестик рядом со строкой Type objective_function<...
с зависанием над ошибкой:
Variable templates are a C++1y extension
expected ';' at end of declaration
expected unqualified-id
Что я должен сделать, чтобы исправить это так, чтобы функция урока компилировалась?
Информация о сессии:
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
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] TMB_1.7.8
loaded via a namespace (and not attached):
[1] Matrix_1.2-8 tools_3.3.2 grid_3.3.2 lattice_0.20-34
Теперь я решил свою проблему, которая состояла из двух частей. Первый не имел Rtools
установлен в Windows. Это упоминается здесь:
Почему я не могу создавать и запускать модели в Windows после установки TMB из CRAN? TMB на Windows требует Rtools. Переменная окружения PATH должна указывать на Rtools «make» и «gcc», а не на другие экземпляры «make» или «gcc».
Вторая проблема заключалась в том, что после установки Rtools
Я все еще не мог найти компиляцию, несмотря на проверку того, что я могу использовать ее из командной строки, следующей эти инструкции:
In some cases this PATH might be C:\RBuildTools... Further, we can check if g++ can be really called from R. For example, we can see the version of gcc in R as follows.
> system('g++ -v')
Using built-in specs.
COLLECT_GCC=c:\Rtools\GCC-46~1.3\bin\G__~1.EXE
COLLECT_LTO_WRAPPER=c:/rtools/gcc-46~1.3/bin/../libexec/gcc/i686-w64-mingw32/4.6.3/lto-wrapper.exe
Target: i686-w64-mingw32
Configured with: /data/gannet/ripley/Sources/mingw-test3/src/gcc/configure --host=i686-w64-mingw32 --build=x86_64-linux-gnu --target=i686-w64-mingw32 --with-sysroot=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/mingw32 --prefix=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/mingw32 --with-gmp=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/prereq_install --with-mpfr=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/prereq_install --with-mpc=/data/gannet/ripley/Sources/mingw-test3/mingw32mingw32/prereq_install --disable-shared --enable-static --enable-targets=all --enable-languages=c,c++,fortran --enable-libgomp --enable-sjlj-exceptions --enable-fully-dynamic-string --disable-nls --disable-werror --enable-checking=release --disable-win32-registry --disable-rpath --disable-werror CFLAGS='-O2 -mtune=core2 -fomit-frame-pointer' LDFLAGS=
Thread model: win32
gcc version 4.6.3 20111208 (prerelease) (GCC)
> system('where make')
c:\Rtools\bin\make.exe
Я получил ошибку:
> compile('tutorial.cpp')
c:/Rtools/mingw_64/bin/g++
...
c:/Rtools/mingw_64/bin/g++: not found
Это говорит о том, что путь где-то жестко кодируется. Следуя инструкциям по использованию альтернативные компиляторы gcc, Я обнаружил, что путь был жестко закодирован в моем Makeconf
файл находится по адресу: "C:\Program Files\R\R-3.3.2\etc\x64\Makeconf"
Затем я закомментировал старую строку и заменил ее на правильный путь:
# BINPREF ?= c:/Rtools/mingw_64/bin/
BINPREF ?= C:/RBuildTools/3.4/mingw_64/bin/
После этого компиляция работает без перезапуска.
Других решений пока нет …