无法为窗口生成包含C++库的R包

R package containing C++ library cannot build for window

本文关键字:C++ 库的 包含 窗口      更新时间:2023-10-16

我正在尝试使用Rcpp编写一个R包。我成功地使它适用于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)

为了在MakefileWin中制作DLL,我使用了:

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:警告:在没有dllimport属性的情况下重新声明了"ANNdist anDiskt(int,ANNpoint,ANNpoint)":忽略了以前的dllimport[-Wattributes]

perf.cpp:71:14:错误:函数"void annResetStats(int)"定义标记为dllimport

我尝试了不同的事情,但我很难理解我到底应该在这里做什么。

我还试着把所有的源文件复制到src文件夹中,并有一个简单的makewars文件,然后我得到了不同的错误,比如:

compute_TE.o:compute_TE.cpp:(.text+0x8ad):对`_imp___Z11annAllocPtsii'的未定义引用

错误消息非常清楚。在您的代码中

DLL_API void annResetStats(int data_size);

在代码中

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

您定义DLL_API是为了让visual studio编译器满意,但R不使用它

请尝试删除此类行,然后重新编译。