我正在尝试使用来自RTools的g ++以下列方式从Windows 7 x64上的RInside \ examples \ standard目录构建rinside_sample1.cpp:
set RCPP=%R_HOME%\library\Rcpp
set RINSIDE=%R_HOME%\library\RInside
g++ -c -m64 rinside_sample1.cpp -I %RINSIDE%\include -I %RCPP%\include -I %R_HOME%\include
g++ -m64 rinside_sample1.o -o rinside_sample1.exe -L %RINSIDE%\libs\x64 -l RInside -L %RCPP%\libs\x64 -l Rcpp -L %R_HOME%\bin\x64 -l R
链接导致多重定义错误:
d000026.o:(.idata$5+0x0): multiple definition of `__imp__ZTVN4Rcpp7RObjectE'
d000019.o:(.idata$5+0x0): first defined here
d000026.o:(.idata$6+0x0): multiple definition of `__nm__ZTVN4Rcpp7RObjectE'
d000019.o:(.idata$6+0x0): first defined here
collect2: ld returned 1 exit status
然而,rinside_sample0.cpp的类似构建过程会成功。有没有人知道解决方案?
似乎rinside_sample1.cpp的问题是由于Rcpp :: NumericMatrix和Rcpp :: NumericVector的使用而产生的。
rinside_sample0.cpp代码:
// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8; -*-
//
// Simple example showing how to do the standard 'hello, world' using embedded R
//
// Copyright (C) 2009 Dirk Eddelbuettel
// Copyright (C) 2010 Dirk Eddelbuettel and Romain Francois
//
// GPL'ed
#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);
}
rinside_sample1.cpp代码:
// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4; tab-width: 8; -*-
//
// Simple example with data in C++ that is passed to R, processed and a result is extracted
//
// Copyright (C) 2009 Dirk Eddelbuettel
// Copyright (C) 2010 - 2011 Dirk Eddelbuettel and Romain Francois
//
// GPL'ed
#include <RInside.h> // for the embedded R via RInside
Rcpp::NumericMatrix createMatrix(const int n) {
Rcpp::NumericMatrix M(n,n);
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
M(i,j) = i*10 + j;
}
}
return(M);
}
int main(int argc, char *argv[]) {
RInside R(argc, argv); // create an embedded R instance
const int mdim = 4; // let the matrices be 4 by 4; create, fill
R["M"] = createMatrix(mdim); // then assign data Matrix to R's 'M' var
std::string str =
"cat('Running ls()\n'); print(ls()); "
"cat('Showing M\n'); print(M); "
"cat('Showing colSums()\n'); Z <- colSums(M); print(Z); "
"Z"; // returns Z
Rcpp::NumericVector v = R.parseEval(str); // eval string, Z then assigned to num. vec
for (int i=0; i< v.size(); i++) { // show the result
std::cout << "In C++ element " << i << " is " << v[i] << std::endl;
}
exit(0);
}
答案 0 :(得分:1)
你有没有理由不使用我提供的Makefile,哪个有效?只是说
make rinside_sample1
,在我的机器上,导致
edd@max:~/svn/rinside/pkg/inst/examples/standard$ make rinside_sample1
g++ -I/usr/share/R/include -I/usr/local/lib/R/site-library/Rcpp/include \
-I/usr/local/lib/R/site-library/RInside/include -O3 -pipe -g -Wall \
rinside_sample1.cpp -L/usr/lib/R/lib -lR -lblas -llapack \
-L/usr/local/lib/R/site-library/Rcpp/lib \
-lRcpp -Wl,-rpath,/usr/local/lib/R/site-library/Rcpp/lib \
-L/usr/local/lib/R/site-library/RInside/lib \
-lRInside -Wl,-rpath,/usr/local/lib/R/site-library/RInside/lib \
-o rinside_sample1
edd@max:~/svn/rinside/pkg/inst/examples/standard$
之后我们可以做
edd@max:~/svn/rinside/pkg/inst/examples/standard$ ./rinside_sample1
Running ls()
[1] "argv" "M"
Showing M
[,1] [,2] [,3] [,4]
[1,] 0 1 2 3
[2,] 10 11 12 13
[3,] 20 21 22 23
[4,] 30 31 32 33
Showing colSums()
[1] 60 64 68 72
In C++ element 0 is 60
In C++ element 1 is 64
In C++ element 2 is 68
In C++ element 3 is 72
edd@max:~/svn/rinside/pkg/inst/examples/standard$
它在Windows上的工作方式相同,但您需要执行
make -f Makefile.win rinside_sample1