множественное определение `imp_ZTVN4Rcpp14not_compatibleE` в WindowsXP с RInside

Программное обеспечение, о котором я говорю, содержит 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

введите описание изображения здесь

-2

Решение

Семантика связывания в Linux и Windows различна, особенно для динамических библиотек.

Предлагаю прочитать Левина компоновщики и загрузчики книга.

Смотрите также этот вопрос, и искать Атрибуты функции Gcc, dllexport а также dllimport,

С Qt вам может понадобиться Q_DECL_EXPORT и т.д …. (этот макрос Qt будет работать как в Linux, так и в Windows).

1

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

Я сказал:

Это решено Проблема не была связана с файлом .pro, это было связано с синтаксисом parseEval функция. Rinside у меня есть на
Linux старше, чем у меня на Windows. Версии Rcpp
Установленные также разные в моей системе Linux и Windows.

Этот синтаксис parseEvalint returnValue = R.parseEval
("sum");
отлично работает на Linux со старым RInside, но не работает на
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

0

По вопросам рекламы [email protected]