4

我开始在 C++ 中使用 rinside 和 rcpp。我只想从零开始,所以我的 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。

4

3 回答 3

3

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

作为从 Qt 源代码开始的概念验证,我做了一次。

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

于 2012-09-05T11:58:13.323 回答
3

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

要让 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 应用程序。

于 2012-11-28T15:42:09.957 回答
1

只是为了分享我迄今为止在 Windows 7 64 位和 Windows XP SP3 32 位中使用 Rcpp 和 Rinside 的“经验”。我安装了最新版本的 R (2.15.1) 并从源代码安装了 Rcpp 和 RInside。

install.packages("路径/Rcpp_x.xxtar.gz",repos=NULL,type="source",INSTALL_opts="--no-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:(.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): undefined reference to对 Rcpp::Language'C 的 vtable 的引用:/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 toRcpp::Function::~Function( )' C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp:(.text+0xd2c): 未定义引用 `Rcpp::DottedPair: :操作员'

我认为这仅与未正确包含的库相关。- 我发现的另一件事:处理 qtdensity.pro 中 rcpp 和 rinside 的标头和库的脚本仅在我将简单引号更改为双引号时才起作用:而不是:

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

我改为:

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

还在玩它,会让你知道接下来会发生什么:) Andry

于 2012-09-07T13:07:42.363 回答