【问题标题】:Multiple definition error building RInside samples on Windows 7 x64在 Windows 7 x64 上构建 RInside 示例的多定义错误
【发布时间】:2012-07-31 20:34:33
【问题描述】:

我正在尝试使用 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);
}

【问题讨论】:

    标签: r rcpp rinside


    【解决方案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
    

    【讨论】:

    • 当我使用 x64 版本时,我在 Makefile.win 中取消了 R_ARCH := --arch x64 行的注释。不幸的是,这会为RINSIDELIBS 产生不正确的值,我得到g++ -m64 -IC:/R/R-2.15.1/include -IC:/R/R-2.15.1/include/x64 -IC:/R/R-2.15.1/library/Rcpp/include -IC:/R/R-2.15.1/library/RInside/include -O2 -Wall -mtune=core2 -Wall -s rinside_sample3.cpp -LC:/R/R-2.15.1/bin/x64 -lR -LC:/R/R-2.15.1/bin/x64 -lRblas -LC:/R/R-2.15.1/bin/x64 -lRlapack "/libRInside.a" C:/R/R-2.15.1/library/Rcpp/lib/x64/libRcpp.a -o rinside_sample1 g++.exe: error: /libRInside.a: No such file or directory
    • R_ARCH := --arch i386的情况下不存在这样的问题。但是,现在很清楚 x64 的正确构建命令了 - 感谢您的帮助!
    • 我的印象是当前的 R 和当前的 Rtools for Windows 可以无缝构建 32 位和 64 位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多