Программное обеспечение, о котором я говорю, содержит 5 файлов и «прекрасно работает» на openSUSE 11.3
с gcc-4.5.1
:
Это же программное обеспечение показывает следующую ошибку на Windows XP
с Mingw (gcc-4.6.3)
,
ОБНОВИТЬ
Проблема обнаружена.
Проблема в том, что функция R parseEval
,
Есть две похожие функции: parseEval
а также parseEvalQ
,
Первый возвращает значение, а другой возвращает void.
я использовал parseEval
в проекте C ++ plus Qt, и он прекрасно работает в Linux, а в Windows выдает ошибку, показанную выше.
Вот воспроизводимый пример:
demo.cpp
#include <iostream>
#include <RInside.h>
#include <Rcpp.h>
RInside R (0, NULL);
RInside & qtToR (R);
int main ()
{
int numberOne = 1;
int numberTwo = 2;
qtToR ["numberOne"] = numberOne;
qtToR ["numberTwo"] = numberTwo;
R.parseEvalQ ("sum = numberOne + numberTwo;");
int returnValue = R.parseEval ("sum");
std :: cout << "\n" << returnValue << "\n";
}
Соответствующий файл .pro:
TEMPLATE = app
TARGET =
DEPENDPATH += .
SOURCES += demo.cpp
INCLUDEPATH += .
INCLUDEPATH += c:/R-2.15.1/include
INCLUDEPATH += c:/R-2.15.1/library/Rcpp/include
INCLUDEPATH += c:/R-2.15.1/library/RInside/include
LIBS += -Lc:/R-2.15.1/bin/i386 -lR
LIBS += -Lc:/R-2.15.1/library/Rcpp/libs/i386 -lRcpp
LIBS += -Lc:/R-2.15.1/library/RInside/libs/i386 -lRInside
# You'll keep pulling your hair if you miss this statement when you are on windows.
CONFIG += console
Семантика связывания в Linux и Windows различна, особенно для динамических библиотек.
Предлагаю прочитать Левина компоновщики и загрузчики книга.
Смотрите также этот вопрос, и искать Атрибуты функции Gcc, dllexport
а также dllimport
,
С Qt вам может понадобиться Q_DECL_EXPORT и т.д …. (этот макрос Qt будет работать как в Linux, так и в Windows).
Я сказал:
Это решено Проблема не была связана с файлом .pro, это было связано с синтаксисом
parseEval
функция. Rinside у меня есть на
Linux старше, чем у меня на Windows. Версии Rcpp
Установленные также разные в моей системе Linux и Windows.Этот синтаксис
parseEval
—int returnValue = R.parseEval
отлично работает на Linux со старым RInside, но не работает на
("sum");
Windows с более новым RInside.Итак, я изменил приведенный выше код следующим образом, и он успешно скомпилирован
с вышеупомянутым .pro-файлом.
SEXP ans;
int returnValue = R.parseEval ("sum", ans);
Это скомпилировалось успешно, но, к моему ужасу, эта радость была просто спокойствием перед бурей!
Та же самая ошибка теперь переместилась во время выполнения!
Таким образом, постоянное решение этой ошибки — редактирование файла .pro и создание ссылок. Rcpp ПОСЛЕ RInside:
LIBS += -Lc:/R-2.15.1/library/RInside/libs/i386 -lRInside
LIBS += -Lc:/R-2.15.1/library/Rcpp/libs/i386 -lRcpp