在 Windows 下编译 RInside 示例时出错

Error with compiling RInside examples under Windows

我目前正在尝试使用 RInside 在回测中做一些绘图,受到 Saving Lattice Plots with RInside and Rcpp 的启发。我通过编译 RInside 遇到了问题。在深入探讨我的问题之前,我已经查看了前三个问题:

  1. Problem with compiling RInside examples under Windows

  2. Building (and running) RInside examples under windows;

  3. Compiling RInside programs on Windows.

但它无法解决我的问题。按照标准步骤,我安装了最新的 RInside 软件包,并执行了包含在下载的 RInside 二进制文件中的以下 makefile Makefile.win

## -*- mode: makefile; tab-width: 8; -*-
##
## Simple Makefile for Windows
##
## Note that the libRInside library encodes the value of R_HOME found
## at compilation. So if you use the CRAN package of RInside, its value
## may not correspond to where you have R installed.  One quick fix is 
## export the appropriate value of R_HOME, eg ony my work machine
##           set R_HOME=C:\opt\R-current
## The other is to re-install RInside from source on your machine.
## Either one should allow you to actually run the binaries created
## with this Makefile


## This version is fairly directly derived from the Unix versions
## You may have to set R_HOME manually if this does not work
## It requires Rtools in the path -- as does all R package building
#R_HOME :=      $(shell R RHOME | sed -e "s|\\|\/|g")
R_HOME :=       "C:/R/R-3.1.3"

## You may have to set this to one of the two values below to enforce a  particular
## architecture in case the autodetection in the next line does not work correctly
##R_ARCH :=     --arch $(shell echo 'cat(.Platform$$r_arch)' | R --vanilla --slave)
##R_ARCH :=     --arch i386
R_ARCH :=       --arch x64


## You may need to set R_LIBS_USER if Rcpp or RInside are installed where R does not see them by default
R_LIBS_USER :=       "C:/R/R-3.1.3/library"

sources :=          $(wildcard *.cpp)
programs :=         $(sources:.cpp=)

## include headers and libraries for R
RCPPFLAGS :=        $(shell $(R_HOME)/bin/R $(R_ARCH) CMD config --cppflags)
RLDFLAGS :=         $(shell $(R_HOME)/bin/R $(R_ARCH) CMD config --ldflags)
RBLAS :=        $(shell $(R_HOME)/bin/R $(R_ARCH) CMD config BLAS_LIBS)
RLAPACK :=      $(shell $(R_HOME)/bin/R $(R_ARCH) CMD config LAPACK_LIBS)

## include headers and libraries for Rcpp interface classes
RCPPINCL :=         $(shell echo 'Rcpp:::CxxFlags()' | $(R_HOME)/bin/R $(R_ARCH) --vanilla --slave)
RCPPLIBS :=         $(shell echo 'Rcpp:::LdFlags()'  | $(R_HOME)/bin/R $(R_ARCH) --vanilla --slave)

## include headers and libraries for RInside embedding classes
RINSIDEINCL :=      $(shell echo 'RInside:::CxxFlags()' | $(R_HOME)/bin/R $(R_ARCH) --vanilla --slave)
RINSIDELIBS :=      $(shell echo 'RInside:::LdFlags()'  | $(R_HOME)/bin/R $(R_ARCH) --vanilla --slave)

## compiler etc settings used in default make rules
CXX :=          $(shell $(R_HOME)/bin/R $(R_ARCH) CMD config CXX)
CPPFLAGS :=         -Wall $(shell $(R_HOME)/bin/R $(R_ARCH) CMD config CPPFLAGS)
CXXFLAGS :=         $(RCPPFLAGS) $(RCPPINCL) $(RINSIDEINCL) $(shell $(R_HOME)/bin/R $(R_ARCH) CMD config CXXFLAGS)
LDFLAGS =       -s
LDLIBS :=       $(RLDFLAGS) $(RBLAS) $(RLAPACK) $(RINSIDELIBS) $(RCPPLIBS)
CC :=           $(shell $(R_HOME)/bin/R $(R_ARCH) CMD config CXX)

all :           $(programs)

clean:
            rm -vf $(programs)

checkR:
            echo "R is at $(R_HOME)"

我在 Makefile.win 中所做的更改使其可执行 R_HOME := "C:/R/R-3.1.3"R_LIBS_USER := "C:/R/R-3.1.3/library"R_ARCH := --arch x64,并按照 Problem with compiling RInside examples under Windows 的想法进行了更改RProfile.site 为:

# Things you might want to change

# options(papersize="a4")
# options(editor="notepad")
# options(pager="internal")

# set the default help type
# options(help_type="text")
  options(help_type="html")

# set a site library
.Library.site <- file.path("C:/R/R-3.1.3/library")

# set a CRAN mirror
# local({r <- getOption("repos")
#       r["CRAN"] <- "http://my.local.cran"
#       options(repos=r)})

# Give a fortune cookie, but only to interactive sessions
# (This would need the fortunes package to be installed.)
#  if (interactive()) 
#    fortunes::fortune()

运行 make -f Marfile.win,我把cmd复制为:

c:\R\R-3.1.3\library\RInside\examples\standard>make -f Makefile.win
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_callbacks0.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/
bin/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/l
ib/x64/libRInside.a"  -o rinside_callbacks0
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_callbacks1.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/
bin/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/l
ib/x64/libRInside.a"  -o rinside_callbacks1
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_module_sample0.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.
1.3/bin/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInsi
de/lib/x64/libRInside.a"  -o rinside_module_sample0
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample0.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin
/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/
x64/libRInside.a"  -o rinside_sample0
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample1.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin
/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/
x64/libRInside.a"  -o rinside_sample1
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample10.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bi
n/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib
/x64/libRInside.a"  -o rinside_sample10
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample11.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bi
n/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib
/x64/libRInside.a"  -o rinside_sample11
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample12.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bi
n/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib
/x64/libRInside.a"  -o rinside_sample12
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample13.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bi
n/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib
/x64/libRInside.a"  -o rinside_sample13
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample14.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bi
n/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib
/x64/libRInside.a"  -o rinside_sample14
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample15.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bi
n/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib
/x64/libRInside.a"  -o rinside_sample15
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample16.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bi
n/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib
/x64/libRInside.a"  -o rinside_sample16
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample17.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bi
n/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib
/x64/libRInside.a"  -o rinside_sample17
C:/R/R-3.1.3/library/Rcpp/include/Rcpp/protection/Armor.h:38:23: warning: inline
 function 'Rcpp::Armor<T>& Rcpp::Armor<T>::operator=(const U&) [with U = SEXPREC
*, T = SEXPREC*, Rcpp::Armor<T> = Rcpp::Armor<SEXPREC*>]' used but never defined
 [enabled by default]
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample2.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin
/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/
x64/libRInside.a"  -o rinside_sample2
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample3.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin
/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/
x64/libRInside.a"  -o rinside_sample3
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample4.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin
/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/
x64/libRInside.a"  -o rinside_sample4
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample5.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin
/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/
x64/libRInside.a"  -o rinside_sample5
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample6.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin
/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/
x64/libRInside.a"  -o rinside_sample6
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample7.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin
/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/
x64/libRInside.a"  -o rinside_sample7
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample8.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin
/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/
x64/libRInside.a"  -o rinside_sample8
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_sample9.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin
/x64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/
x64/libRInside.a"  -o rinside_sample9
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_test0.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin/x
64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/x6
4/libRInside.a"  -o rinside_test0
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_test1.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin/x
64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/x6
4/libRInside.a"  -o rinside_test1
g++ -m64 -IC:/R/R-3.1.3/include -IC:/R/R-3.1.3/include/x64 -IC:/R/R-3.1.3/librar
y/Rcpp/include -IC:/R/R-3.1.3/library/RInside/include -O2 -Wall -mtune=core2 -Wa
ll  -s  rinside_test2.cpp    -LC:/R/R-3.1.3/bin/x64 -lR -lm -LC:/R/R-3.1.3/bin/x
64 -lRblas -LC:/R/R-3.1.3/bin/x64 -lRlapack "C:/R/R-3.1.3/library/RInside/lib/x6
4/libRInside.a"  -o rinside_test2

但是当我尝试其中一个例子时,说:

#include <RInside.h>                    // for the embedded R via RInside

int main(int argc, char *argv[]) {

    RInside R(argc, argv);              // create an embedded R instance

    R["txt"] = "Hello, world!\n";   // assign a char* (string) to 'txt'

    R.parseEvalQ("cat(txt)");           // eval the init string, ignoring any returns

    exit(0);
}

它给出了以下错误:

 # Rcpp::sourceCpp('C:/R/R-3.1.3/library/RInside/examples/standard/rinside_sample0.cpp')
g++ -m64 -I"C:/R/R-31~1.3/include" -DNDEBUG     -I"C:/R/R-3.1.3/library/Rcpp/include" -I"C:/R/R-3.1.3/library/RInside/examples/standard"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c rinside_sample0.cpp -o rinside_sample0.o
rinside_sample0.cpp:10:74: fatal error: RInside.h: No such file or directory
compilation terminated.
make: *** [rinside_sample0.o] Error 1
Warning message:
running command 'make -f "C:/R/R-31~1.3/etc/x64/Makeconf" -f "C:/R/R-31~1.3/share/make/winshlib.mk" SHLIB_LDFLAGS='$(SHLIB_CXXLDFLAGS)' SHLIB_LD='$(SHLIB_CXXLD)' SHLIB="sourceCpp_78644.dll" WIN=64 TCLBIN=64 OBJECTS="rinside_sample0.o"' had status 2 
Error in Rcpp::sourceCpp("C:/R/R-3.1.3/library/RInside/examples/standard/rinside_sample0.cpp") : 
  Error 1 occurred building shared library.

我觉得可能是少了一些depends,所以加了// [[Rcpp::depends(RInside)]],也没用,报错如下:

# Rcpp::sourceCpp('C:/R/R-3.1.3/library/RInside/examples/standard/rinside_sample0.cpp')
g++ -m64 -I"C:/R/R-31~1.3/include" -DNDEBUG     -I"C:/R/R-3.1.3/library/Rcpp/include" -I"C:/R/R-3.1.3/library/RInside/include" -I"C:/R/R-3.1.3/library/RInside/examples/standard"  -I"d:/RCompile/CRANpkg/extralibs64/local/include"     -O2 -Wall  -mtune=core2 -c rinside_sample0.cpp -o rinside_sample0.o
g++ -m64 -shared -s -static-libgcc -o sourceCpp_73309.dll tmp.def rinside_sample0.o -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/R/R-31~1.3/bin/x64 -lR
rinside_sample0.o:rinside_sample0.cpp:(.text.startup+0x9b): undefined reference to `RInside::RInside(int, char const* const*, bool, bool, bool)'
rinside_sample0.o:rinside_sample0.cpp:(.text.startup+0xe4): undefined reference to `RInside::operator[](std::string const&)'
rinside_sample0.o:rinside_sample0.cpp:(.text.startup+0x16b): undefined reference to `RInside::parseEvalQ(std::string const&)'
rinside_sample0.o:rinside_sample0.cpp:(.text.startup+0x1cc): undefined reference to `RInside::~RInside()'
collect2: ld returned 1 exit status
Error in Rcpp::sourceCpp("C:/R/R-3.1.3/library/RInside/examples/standard/rinside_sample0.cpp") : 
  Error occurred building shared library.

希望有人能分享一些有价值的见解!谢谢

错误很明显:RInside.h: No such file or directory

您需要弄清楚为什么 RInside 头目录的 -I.... 指令没有通过,或者该目录是否消失了,或者...

这些构建说明已有数年历史,并且经过了相当充分的测试:它们通常有效。