0

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)

で 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' への未定義の参照

4

1 に答える 1

1

エラーメッセージは十分に明確です。あなたのコードで

DLL_API void annResetStats(int data_size);

そして、コードで

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

Visual Studio のコンパイラを満足させるように定義DLL_APIしますが、R はそれを使用しません。

そのような行を削除して、再度コンパイルしてください。

于 2015-12-08T20:13:13.350 に答える