использование rinside с qt в windows

Я начинаю использовать 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.


person Andrianiaina Rakotondrajoa    schedule 05.09.2012    source источник
comment
Кроме того, вам нужно заменить lib на libs в вашем файле .pro.   -  person Aquarius_Girl    schedule 03.11.2012


Ответы (3)


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

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

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

person Dirk Eddelbuettel    schedule 05.09.2012
comment
Спасибо за ответ Дирк. Я использую QT, который сам создал с помощью MinGW. Что касается проекта qtdensity, я все еще изучаю его, но хочу постепенно начать с RInside и Rcpp. Могут ли быть проблемой разные версии MinGW для R и QT?? - person Andrianiaina Rakotondrajoa; 05.09.2012
comment
Да, они могут. Начните с пересборки работающего и полного примера для Qt, поставляемого с RInside; есть причина, по которой он включен. Однако может потребоваться настройка на стороне Windows .pro. - person Dirk Eddelbuettel; 05.09.2012
comment
После настройки в файле .pro все необходимые библиотеки найдены, но у меня те же ошибки, что и раньше (неопределенная ссылка на `__gxx_personality_sj0' ....). Как вы думаете, мне нужно пересобирать R вместо того, чтобы использовать предоставленный установщик Windows ?? - person Andrianiaina Rakotondrajoa; 05.09.2012
comment
Не уверен, но я бы рекомендовал использовать один и тот же компилятор и т. д. для R и Qt, если можно. Насколько я помню, у меня он работал, так что он может работать, но, как и многие другие вещи в Windows, неудобен. Пожалуйста, отчитайтесь, желательно по списку rcpp-devel. - person Dirk Eddelbuettel; 05.09.2012
comment
@AndrianiainaRakotondrajoa Сегодня я столкнулся с той же проблемой. Различные версии mingw для Qt и R, ARE, ответственны за эту ошибку. В качестве решения я распаковал нужную версию mingw в папку mingw Qt. Сейчас этой ошибки нет. - person Aquarius_Girl; 03.11.2012

Вы должны сообщить компоновщику, что он должен ссылаться на 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 и RInside и для компиляции вашего приложения Qt.

person Theodore Lytras    schedule 28.11.2012

Просто чтобы поделиться своим «опытом» с Rcpp и Rinside до сих пор в 64-битной Windows 7 и 32-битной Windows XP SP3. Я установил последнюю версию 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 в обеих системах (всегда с --arch32 в Makefile.win)
  • Я могу запустить все исполняемые файлы в 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::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 для 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 toRcpp::Function::~Function( )' C:/R/R-2.15.1/library/RInside/lib/i386/libRInside.a(RInside.o):RInside.cpp:(.text+0xd2c): неопределенная ссылка на `Rcpp::DottedPair: :оператор

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

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

Я изменил на:

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

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

person Andrianiaina Rakotondrajoa    schedule 07.09.2012
comment
Поскольку это действительно не ответ, не могли бы вы вместо этого добавить его к своему вопросу? - person Roman Luštrik; 07.09.2012