2015-12-07 47 views
0

我正在嘗試使用Rcpp編寫R包。我成功地使它適用於Linux,但不適用於Windows。包含C++庫的R包無法爲窗口生成

它包含我的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: warning: 'ANNdist annDist(int, ANNpoint, ANNpoint)' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes]

perf.cpp:71:14: error: function 'void annResetStats(int)' definition is marked dllimport

我嘗試不同的東西,但我有一個問題,瞭解究竟我應該在這裏做。

我也試過只複製所有的源文件進入src文件夾,並有一個簡單的makewars文件,然後我得到了不同的錯誤,如:

compute_TE.o:compute_TE.cpp:(.text+0x8ad): undefined reference to `_imp___Z11annAllocPtsii'

回答

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,使視覺工作室編譯高興,但R不使用它。

請嘗試刪除這些行並重新編譯。

+0

非常感謝。這部分不是我的代碼,因此我不知道這是什麼。 – Ghazale

+0

@Ghazale DLL_API只對視覺工作室有用。刪除'DLL_API'應該使你的代碼在Windows上工作。 –