无法为窗口生成包含C++库的R包
R package containing C++ library cannot build for window
我正在尝试使用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不使用它
请尝试删除此类行,然后重新编译。
相关文章:
- c++库的公共头文件中应该包含什么
- 序列化,没有库的整数,得到奇怪的结果
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 针对遗留库的链接:来自预制makefile的-lgfortranbegin
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- Android Studio 中带有静态库的原生C++代码
- 如何在OpenSSL库的名称中添加后缀'd'?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 为什么提升图库的 read_graphviz() 函数会改变节点的索引
- 在Visual Studio C++项目中包含源库的正确方法是什么?
- 良好做法:如何定义用于编译的外部库的路径
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 将共享库的搜索路径更改为生成文件中提供的 rpath
- 编译依赖于 QTCore 库的 WASM
- 在不使用字符串库的情况下输入字符*
- 如何公开库的枚举,以便我的代码不必键入整个命名空间来使用该枚举?
- 如何在公共头文件中向库的用户公开枚举,同时在内部使用它?
- 获取 clang++:错误:在编译文件系统库的代码时