2012-09-05 42 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應用程序。