我所说的软件包含5个文件,并使用openSUSE 11.3
gcc-4.5.1
编译“完全正常”:
相同的软件在Windows XP
Mingw (gcc-4.6.3)
上显示以下错误。
更新
发现问题。
问题在于R的功能parseEval
。
有两个类似的功能:parseEval
和parseEvalQ
。
前者返回一个值,另一个返回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
答案 0 :(得分:1)
链接语义在Linux和Windows中是不同的,特别是对于动态库。
我建议您阅读Levine's linkers and loaders本书。
另请参阅this question,并查找Gcc function attributes,dllexport
和dllimport
。
使用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