dll — пакет R, содержащий библиотеку C ++, не может быть собран для окна

Я пытаюсь написать пакет R, используя Rcpp. Мне удалось заставить его работать для Linux, но не для Windows.

Он содержит мои коды C ++, а также другую библиотеку.
Код доступен здесь: https://github.com/Healthcast/TransEnt/tree/devel-win

в Makevars.win Вы можете видеть, что я управляю MakefileWin для библиотеки:

PKG_CPPFLAGS = -Iann_1.1.2/include -I$(BOOSTLIB)
PKG_LIBS = -Lann_1.1.2/lib -lANN -lstdc++
OBJECTS= RcppExports.o compute_TE.o
all: before $(SHLIB)
before: annLib
annLib:
(cd ann_1.1.2/src; make -f MakefileWin; make clean)

И для создания DLL в MakefileWin, Я использую:

ANNLIB = libANN.dll
LIBNAME = ANN
DLLFLAGS = -shared
(other stuff)
$(LIBDIR)/$(ANNLIB): $(OBJECTS)
$(C++) $(DLLFLAGS) -o cyg${LIBNAME}.dll \
-Wl,--out-implib=lib${LIBNAME}.dll.a \
-Wl,--export-all-symbols \
-Wl,--enable-auto-import \
-Wl,--whole-archive $(OBJECTS) \
-Wl,--no-whole-archive

Проблема в том, что я не могу сделать DLL. Я получаю предупреждения и ошибки. (Но не в Linux) такие как:

ANN.cpp: 46: 9: предупреждение: ‘ANNdist annDist (int, ANNpoint, ANNpoint)’ повторно объявлено без атрибута dllimport: предыдущий dllimport игнорируется [-Wattributes]

perf.cpp: 71: 14: ошибка: определение функции ‘void annResetStats (int)’ помечено как dllimport

Я пробовал разные вещи, но у меня проблемы с пониманием, что именно я должен делать здесь.

Я также попытался просто скопировать все исходные файлы в папку src и получить простой файл makewars, а затем я получил различные ошибки, такие как:

compute_TE.o: compute_TE.cpp :(. text + 0x8ad): неопределенная ссылка на `_imp___Z11annAllocPtsii ‘

0

Решение

Сообщение об ошибке достаточно ясно. В вашем код

DLL_API void annResetStats(int data_size);

И в код

#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

Вы определяете DLL_API чтобы сделать визуальный студийный компилятор счастливым, но R его не использует.

Пожалуйста, попробуйте удалить такие строки и скомпилировать их снова.

1

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

Других решений пока нет …

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