【问题标题】:using rinside with qt in windows在 Windows 中使用 rinside 和 qt
【发布时间】:2012-08-30 03:06:54
【问题描述】:

我开始在 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。

【问题讨论】:

  • 另外,您需要在 .pro 文件中将 lib 替换为 libs

标签: c++ r qt rcpp rinside


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢你的回答德克。我确实使用了我自己用 MinGW 构建的 QT。至于 qtdensity 项目,我现在还在学习,但我想从 RInside 和 Rcpp 一点一点开始。 R 和 QT 的不同版本的 MinGW 会不会有问题??
  • 是的,他们可以。从重新构建 RInside 附带的 Qt 的工作和完整示例开始;包含它是有原因的。不过,它可能需要在 .pro 的 Windows 端进行调整。
  • 在 .pro 文件中“调整”之后,找到了所有必需的库,但我遇到了与以前相同的错误(未定义对 `__gxx_personality_sj0' 的引用 ....)。你认为我必须重建 R 而不是使用提供的 Windows 安装程序吗??
  • 不确定,但如果可以的话,我建议在 R 和 Qt 中使用相同的编译器等。我记得,我让它工作,所以它可以工作,但它就像 Windows 上的许多东西一样,很繁琐。请务必报告,最好在rcpp-devel 列表中。
  • @AndrianiainaRakotondrajoa 我今天遇到了同样的问题。 Qt 和 R 的不同版本的 mingw,ARE 会导致此错误。作为解决方案,我将所需版本的 mingw 解压缩到 Qt 的 mingw 文件夹中。此错误现已消失。
【解决方案2】:

只是为了分享我迄今为止在 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”和 co。错误(这是一个小改进)。相反,我有以下错误:

C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp:(.text+0xbd1): 未定义对 Rcpp::Language 的 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 tovtable 的引用' 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 toRcpp::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()\")

仍然在玩它,会让你知道接下来会发生什么:) 安德烈

【讨论】:

  • 既然这真的不是一个答案,您能否将其有意义地附加到您的问题中?
【解决方案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 应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多