4

私はc++内でrinsideとrcppを使い始めています。ゼロから始めたいので、QTプロジェクトにはRInsideインスタンスの作成しかなく、解決できない問題があります。プロジェクトにはダイアログフォームが1つしかありません。

私のプロジェクトファイル:

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、MinGW4.6.1を使用しています。

4

3 に答える 3

3

Rcpp に対してリンクする前に、リンカに RInside に対してリンクするように指示する必要があります。この 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 アプリケーションのコンパイルには、同じコンパイラを使用している必要があります。

于 2012-11-28T15:42:09.957 に答える
3

R に使用されるのと同じツールチェーンでビルドされたバージョンの Qt を使用する必要があります。つまり、コンパイラの MinGW ビルドです。

Qtソースから始めて、概念実証として1年に1回行いました。

それに加えて、RInside パッケージのサンプルに同梱されているファイルから始めることを強くお勧めします。qtdensity.pro

于 2012-09-05T11:58:13.323 に答える
1

Windows 7 64 ビットおよび Windows XP SP3 32 ビットでの今までの Rcpp および Rinside との「経験」を共有するためだけに。R の最新バージョン (2.15.1) をインストールし、ソースから Rcpp と RInside をインストールしました。

install.packages("path/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" などはもうありません。エラー (これは少し改善されています)。代わりに、次のエラーがあります。

C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp:(.text+0xbd1): Rcpp 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::Language の vtable への未定義参照 ' C :/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp:(.text+0xcd9): Rcpp Rcpp::Language::update()' C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp:(.text+0xce1): undefined reference to::Function::~Function(への未定義参照)' C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp:(.text+0xd2c): `Rcpp::DottedPair への未定義参照: :オペレーター'

これは、適切に含まれていないライブラリにのみ関連していると思います。- 私が見つけたもう 1 つのこと: 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 に答える