использование Rinside с QT в Windows

Я начинаю использовать rinside и rcpp в c ++. Я просто хочу начать с нуля, поэтому у моего проекта QT нет ничего, кроме создания экземпляра RInside, и у меня есть проблема, которую я не могу решить. У меня только одна диалоговая форма в проекте.

Файл моего проекта:

QT       += core gui

TARGET = rcpp-rinside
TEMPLATE = appSOURCES += main.cpp\
dialog.cpp

HEADERS  += dialog.h

FORMS    += dialog.uiINCLUDEPATH += 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.

3

Решение

Вы должен используйте версию Qt, собранную с тем же набором инструментов, который использовался для R — то есть сборку MinGW компилятора.

Я делал это раз в несколько лет в качестве доказательства концепции, исходящей из источников Qt.

Кроме того, я бы настоятельно рекомендуем начать с qtdensity.pro файл который поставляется с примерами моего пакета RInside.

3

Другие решения

Вы должны указать компоновщику ссылку на RInside, прежде чем ссылаться на Rcpp. Увидеть этот пост rcpp-devel.

Чтобы qtdensity работал под Windows, вам нужно изменить строку 46 файла qtdensity.pro:

QMAKE_LIBS += $$RLDFLAGS $$RBLAS $$RLAPACK $$RCPPLIBS $$RINSIDELIBS

и измените порядок $$ RCPPLIBS и $$ RINSIDELIBS:

QMAKE_LIBS += $$RLDFLAGS $$RBLAS $$RLAPACK $$RINSIDELIBS $$RCPPLIBS

Вы также должны заменить одинарные кавычки на двойные в файле qtdensity.pro, как уже упоминалось. Эти модификации будут в следующей версии RInside (сейчас 0.2.9).

Кроме того, вы должны использовать тот же компилятор для сборки Rcpp & Внутри и скомпилировать ваше приложение Qt.

3

Просто чтобы поделиться своими «впечатлениями» с Rcpp и Rinside до сих пор в 64-битной Windows 7 и 32-битной Windows XP SP3.
Я установил последнюю версию R (2.15.1) и установил Rcpp и RInside из исходного кода.

install.packages ( «путь / Rcpp_x.x.x.tar.gz», Repos = NULL, то тип = «источник», INSTALL_opts = «- нет-мультиархитектурная»)

  • В win7 я не смог установить без опции —no-multiarch.
  • Я мог бы скомпилировать все стандартные примеры RInside в обеих системах (всегда с —arch32 в Makefile.win)
  • Я могу запустить все исполняемые файлы в 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 для Rcpp :: Language ‘
C: /R/R-2.15.1/library/RInside/lib/i386/libRInside.a (RInside.o). RInside.cpp 🙁 текст + 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 :: Функция :: ~ Функция ()»
C: /R/R-2.15.1/library/RInside/lib/i386/libRInside.a (RInside.o). RInside.cpp 🙁 текст + 0xd2c):
неопределенная ссылка на `Rcpp :: DottedPair :: operator ‘

который, я считаю, относится только к библиотекам, которые не включены должным образом.
— Еще одна вещь, которую я нашел: скрипт, работающий с заголовками и библиотеками для rcpp и rinside в qtdensity.pro, работает только тогда, когда я изменил простые кавычки на двойные кавычки:
вместо :

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

Я изменился на:

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

Все еще играем с этим и дадим вам знать, что будет дальше 🙂
Andry

1