【问题标题】:R package containing C++ library cannot build for window包含 C++ 库的 R 包无法为窗口构建
【发布时间】:2015-12-07 00:04:55
【问题描述】:

我正在尝试使用 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:警告:'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' 的未定义引用

【问题讨论】:

    标签: c++ dll rcpp r-package


    【解决方案1】:

    错误信息很清楚。在你的code

    DLL_API void annResetStats(int data_size);
    

    而在code

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

    您定义 DLL_API 以使 Visual Studio 编译器满意,但 R 不使用它。

    请尝试删除这些行并重新编译。

    【讨论】:

    • 非常感谢。那部分不是我的代码,因此我不知道它们是干什么用的。
    • @Ghazale DLL_API 仅对视觉工作室有用。删除 DLL_API 应该可以让您的代码在 Windows 上运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多