在Windows系统中使用RInside与Qt

4

我开始使用rinside和rcpp编写C++。我想从零开始,所以我的QT项目除了创建一个RInside实例之外什么也没有,但是我遇到了一个无法解决的问题。项目中只有一个对话框表格。

我的项目文件:

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。


此外,您需要在您的.pro文件中将lib替换为libs - Aquarius_Girl
3个回答

3

您必须使用与R所使用的工具链相同的Qt版本,即编译器的MinGW构建版本。

我曾经从Qt源代码开始进行过一次概念验证。

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


谢谢你的回答,Dirk。我使用了自己用MinGW构建的QT。至于qtdensity项目,我现在还在学习中,但我想从RInside和Rcpp逐渐开始。不同版本的MinGW对R和QT会有问题吗? - Andrianiaina Rakotondrajoa
是的,他们可以。首先,重新构建RInside附带的Qt工作和完整示例;这是包含在内的原因。但在Windows端的.pro可能需要微调。 - Dirk Eddelbuettel
在 .pro 文件中进行“微调”后,找到了所有所需的库,但我仍然遇到了之前相同的错误(未定义对 __gxx_personality_sj0 的引用...)。您认为我需要重新构建 R 而不是使用提供的 Windows 安装程序吗? - Andrianiaina Rakotondrajoa
我不确定,但我建议如果可能的话在R和Qt中使用相同的编译器等。据我记得,我曾经让它工作过,所以它是可以工作的,但像Windows上的许多其他事情一样,需要小心处理。请回报结果,最好在'rcpp-devel'列表中。 - Dirk Eddelbuettel
1
@AndrianiainaRakotondrajoa 我今天也遇到了同样的问题。Qt和R使用不同版本的mingw,这是导致错误的原因。解决方法是将所需版本的mingw解压缩到Qt的mingw文件夹中。现在这个错误已经消失了。 - Aquarius_Girl

3

在链接 Rcpp 之前,您必须告诉链接器链接到 RInside。请参见此 rcpp-devel 帖子

要在 Windows 下运行 qtdensity,您需要修改 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应用程序。


1

分享一下我在Windows 7 64位和Windows XP SP3 32位上使用Rcpp和Rinside的经验。 我安装了最新版本的R(2.15.1),并从源代码安装了Rcpp和RInside。

install.packages("path/Rcpp_x.x.x.tar.gz",repos=NULL,type="source",INSTALL_opts="--no-multiarch")

  • 在Win7中,我无法安装没有--no-multiarch选项的软件。
  • 我可以在两个系统中编译所有标准的RInside示例(始终使用Makefile.win中的--arch32)。
  • 我可以在Win7中运行所有可执行文件。在WinXP中,我遇到了"无法加载基本包"的错误。
  • 对于QT示例qtdensity,我不再有"__gxx_personality_sj0"等错误(这是一个小进步)。相反,我遇到了以下错误:
C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp:(.text+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): 未定义的符号引用: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): 未定义的符号引用: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的头文件和库文件的脚本仅在我将单引号改为双引号时才起作用: 原来是:

$$system($$R_HOME/bin/Rscript -e \'Rcpp:::CxxFlags()\')

我改成了:

$$system($$R_HOME/bin/Rscript -e \"Rcpp:::CxxFlags()\")

还在尝试中,会让您知道接下来的进展 :) Andry


1
既然这并不是一个答案,您能否将其添加到您的问题中,使之有意义? - Roman Luštrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接