在带有R Inside的Windows XP上多次定义`imp_ZTVN4Rcpp14not_compatibleE`

时间:2012-11-07 08:46:12

标签: c++ windows r rcpp rinside

我所说的软件包含5个文件,并使用openSUSE 11.3 gcc-4.5.1编译“完全正常”:

相同的软件在Windows XP Mingw (gcc-4.6.3)上显示以下错误。

更新

发现问题。

问题在于R的功能parseEval。 有两个类似的功能:parseEvalparseEvalQ。 前者返回一个值,另一个返回void。

我在C ++ plus Qt项目中使用了parseEval,它在Linux上工作得很好,并在Windows上抛出上面显示的错误。

以下是可重复的示例:

demo.cpp

#include <iostream>
#include <RInside.h>
#include <Rcpp.h>

RInside R (0, NULL);
RInside & qtToR (R);

int main ()
{
    int numberOne = 1;
    int numberTwo = 2;

    qtToR ["numberOne"] = numberOne;
    qtToR ["numberTwo"] = numberTwo;

    R.parseEvalQ ("sum = numberOne + numberTwo;");

    int returnValue = R.parseEval ("sum");
    std :: cout << "\n" << returnValue << "\n";
}

对应的.pro文件:

TEMPLATE    = app
TARGET      =
DEPENDPATH  += .

SOURCES     += demo.cpp

INCLUDEPATH += .
INCLUDEPATH += c:/R-2.15.1/include
INCLUDEPATH += c:/R-2.15.1/library/Rcpp/include
INCLUDEPATH += c:/R-2.15.1/library/RInside/include

LIBS        += -Lc:/R-2.15.1/bin/i386 -lR
LIBS        += -Lc:/R-2.15.1/library/Rcpp/libs/i386 -lRcpp
LIBS        += -Lc:/R-2.15.1/library/RInside/libs/i386 -lRInside

# You'll keep pulling your hair if you miss this statement when you are on windows.
CONFIG      += console

enter image description here

2 个答案:

答案 0 :(得分:1)

链接语义在Linux和Windows中是不同的,特别是对于动态库。

我建议您阅读Levine's linkers and loaders本书。

另请参阅this question,并查找Gcc function attributesdllexportdllimport

使用Qt,您可能需要使用Q_DECL_EXPORT等....(此Qt宏将在Linux和Windows上都有效。)

答案 1 :(得分:0)

我说:

  
    

这已经解决了。该问题与.pro文件无关,它与parseEval函数的语法有关。我在附近的里森赛德     Linux比我在Windows上的RInside要老。 Rcpp的版本     在我的Linux系统和Windows系统上安装也不同。

  
     

parseEval - int returnValue = R.parseEval ("sum");的这种语法在Linux上使用较旧的RInside可以正常工作但是失败了   Windows与较新的RInside。

     

所以,我修改了上面的代码如下,并成功编译   使用上面的.pro文件。

     

SEXP ans; int returnValue = R.parseEval ("sum", ans);

这确实编译得很成功,但令我感到恐惧的是,这种喜悦只是暴风雨前的平静! 现在同样的错误转移到了运行时间!

因此,此错误的永久解决方案是编辑.pro文件并链接 Rcpp AFTER RInside

LIBS += -Lc:/R-2.15.1/library/RInside/libs/i386 -lRInside
LIBS += -Lc:/R-2.15.1/library/Rcpp/libs/i386 -lRcpp