2012-09-05 38 views
3

我开始在C++中使用rinside和rcpp。我只想从零开始,所以我的QT项目除了创建一个RInside实例外没有其他任何东西,并且我遇到了一个我无法解决的问题。项目中只有一个对话框。在windows中使用rinside和qt

我的项目文件:

QT  += core gui 

TARGET = rcpp-rinside 
TEMPLATE = app 


SOURCES += main.cpp\ 
    dialog.cpp 

HEADERS += dialog.h 

FORMS += dialog.ui 


INCLUDEPATH += C:\R\R-2.15.1\include 
INCLUDEPATH += C:\R\R-2.15.1\library\Rcpp\include 
INCLUDEPATH += C:\R\R-2.15.1\library\RInside\include 

LIBS += -LC:\R\R-2.15.1\bin\i386 -lR 
LIBS += -LC:\R\R-2.15.1\library\Rcpp\lib\i386\ -lRcpp 
LIBS += -LC:\R\R-2.15.1\library\RInside\lib\i386\ -lRInside 

主要文件:

#include <QtGui/QApplication> 
#include "dialog.h" 

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

    QApplication a(argc, argv); 

    Dialog w; 

    w.show(); 

    return a.exec(); 
} 

对于其他文件,里面空空如也,因为它只是一个空的形式。 当我建立这个,我得到了很多类似下面的错误:

C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x39c): undefined reference to `__gxx_personality_sj0' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x3bb): undefined reference to `_Unwind_SjLj_Register' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x419): undefined reference to `_Unwind_SjLj_Unregister' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x471): undefined reference to `_Unwind_SjLj_Resume' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x4cc): undefined reference to `__gxx_personality_sj0' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x4eb): undefined reference to `_Unwind_SjLj_Register' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x608): undefined reference to `_Unwind_SjLj_Unregister' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x64c): undefined reference to `_Unwind_SjLj_Unregister' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x746): undefined reference to `_Unwind_SjLj_Unregister' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x7f6): undefined reference to `_Unwind_SjLj_Resume' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x84c): undefined reference to `__gxx_personality_sj0' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x86b): undefined reference to `_Unwind_SjLj_Register' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x8c6): undefined reference to `_Unwind_SjLj_Unregister' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x9c5): undefined reference to `_Unwind_SjLj_Resume' 
C:\R\R-2.15.1\library\RInside\lib\i386\/libRInside.a(RInside.o):RInside.cpp:(.text+0x9ec): undefined reference to `__gxx_personality_sj0' 

我使用R-2.15.1,RInside 0.2.7,RCPP 0.9.10,QT 4.8.0,MinGW的4.6。 1。

+0

此外,您需要在.pro文件中用'libs'替换'lib'。 –

回答

3

必须使用一个与用于R的相同工具链构建的Qt版本 - 即编译器的MinGW版本。

我这样做了一年,作为从Qt源头开始的概念验证。

除此之外,我会强烈建议从qtdensity.pro文件开始,附带我的RInside软件包的示例。

+0

谢谢你的回答Dirk。我使用MinGW自己构建的QT。至于qtdensity项目,我现在仍然在学习它,但我想要与RInside和Rcpp一起开始。 不同版本的MinGW for R和QT会出现问题吗? –

+0

是的,他们可以。首先*重建与RInside一起发布的Qt *的工作和完整示例;这是包含的原因。尽管它可能需要在'.pro'的Windows端调整。 –

+0

在.pro文件中进行“调整”之后,找到了所有必需的库,但是我的错误与之前相同(对__gxx_personality_sj0 ....的未定义引用)。你认为我不得不重建R而不是使用提供的Windows安装程序? –

1

只是为了与Rcpp和Rinside分享我的“经验”,直到现在在Windows 7 64位和Windows XP SP3 32位。 我安装了最新版本的R(2.15.1),并从源代码安装了Rcpp和RInside。

install.packages( “路径/ Rcpp_x.xxtar.gz”,回购= NULL,类型= “源极”,INSTALL_opts = “ - 无multiarch”)

  • 在win7,如果没有--no-multiarch选项,我无法安装。
  • 我可以在两个系统中编译所有标准的RInside例子(总是用Makefile.win中的--arch32)
  • 我可以在Win7中运行所有可执行文件。在WinXP中,我有错误“无法加载基础包”
  • 对于QT示例qtdensity,我没有了“__gxx_personality_sj0”和co。错误(这是一点改进)。相反,我有以下错误:

C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp :(。文本+ 0xbd1): 未定义引用Rcpp::Function::Function(std::string const&)' C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp:(.text+0xccd): undefined reference to vtable for Rcpp :: Language' C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp: (.text + 0xcd9): 未定义的参考Rcpp::Language::update()' C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp:(.text+0xce1): undefined reference to Rcpp :: Function ::〜Function()' C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o ):RInside.cpp :(。text + 0xd2c): 未定义引用“Rcpp :: DottedPair :: operator'

我相信只有在图书馆没有适当地包括相关。 - 另一件事,我发现:脚本处理头文件和库在qtdensity.pro工作RCPP和rinside只有当我改变了简单的引号双引号:的 代替:

$$系统($$ R_HOME/bin中/ RSCRIPT -e \ 'RCPP ::: CXXFLAGS()\')

我更改为:

$$系统($$ R_HOME/bin中/ RSCRIPT -e \“RCPP ::: CxxFlags()\“)

不过玩了,将让你知道接下来会发生什么:) 安德里

+1

因为这真的不是一个答案,你可能有意义地将它追加到你的问题呢? –

3

你必须告诉链接对RCPP联之前对RInside链接。请参阅this rcpp-devel post

对于qtdensity在Windows下工作,你需要修改qtdensity.pro文件的第46行:

QMAKE_LIBS += $$RLDFLAGS $$RBLAS $$RLAPACK $$RCPPLIBS $$RINSIDELIBS 

和开关$$ RCPPLIBS和$$ RINSIDELIBS的顺序:

QMAKE_LIBS += $$RLDFLAGS $$RBLAS $$RLAPACK $$RINSIDELIBS $$RCPPLIBS 

如上所述,您还必须在qtdensity.pro文件中用双引号替换单引号。这些修改将在下一个版本的RInside中(目前为0.2.9)。

此外,您必须使用相同的编译器来构建Rcpp & RInside并编译您的Qt应用程序。