我正在使用Window 32位机器来编译使用Rcpp开发并在RStudio 1.0.28中使用Rtools 3.4编译的R包。我不断收到有关 32 位外部 dll (NYCgeo.dll) 中 @ 符号的错误:
thefile.o:thefile.cpp:(.text+0x913): 对 `_imp__NYCgeo@8' 的 undefined reference collect2.exe:错误:ld 返回 1 退出状态
果然,当我在文本编辑器中打开32位NYCgeo.dll时,我发现了@8后缀。这很奇怪,因为当我开发64位版本时,64位NYCgeo.dll不包含@8后缀,并且我没有出现任何错误。不管怎样,我读到了 --kill-at 命令,并且想知道我应该把它包含在哪里。我尝试了 RStudio 的配置构建工具设置以及 makevars.win.in 文件,但没有成功。
回复@Dirk
- 根据要求更新了标题。
- 我正在使用 Rtools 从 RStudio 中编译该包,因此我认为它可能与 RStudio 的项目选项有关。
- 过去一周我一直在检查现有文档。 This post , this post ,和 this post描述我遇到的问题。我的问题是我不知道在哪里指定“--kill-at”或“--add-stdcall-alias”
- 我的包的重点是利用 NYC Dept of City Planning's geocoding software 。我并没有“只是将二进制文件 NYCgeo.dll 添加到其中”。其实我的64-bit version of the package工作正常。我的问题是开发 32 位版本...具体来说,NYCgeo.dll 二进制文件中存在 @8 后缀,这导致了错误。
- NYCgeo.dll 是一个 C 二进制文件。我没有使用 Visual Studio。
- 您提到的上一个问题涉及为我的包的 64 位版本创建 Makevars 文件(再次感谢 @Coatless 提供有用的信息)。 64 位 NYCgeo.dll 二进制文件不包含 @8 后缀。
更新: 我试图为这个问题创建一个更好的标题。问题涉及创建一个 R 包,该包利用另一个软件的功能……在我的例子中,是地理编码软件。具体来说,我遇到的问题是,32位版本的地理编码软件有修饰的dll文件,而64位版本没有。修饰的二进制文件包含 @ 符号,这些符号会在编译期间触发错误。我的任务是设计一种方法来分解(不确定这是否是一个真正的词)32 位 dll,但保留 64 位 dll。
非常感谢。
格雷琴
最佳答案
rJava包对于理解如何处理修饰的二进制文件非常有帮助。
我创建了一个名为 NYCgeo.def
的 def 文件并将其保存在我的 src
目录中:
LIBRARY NYCGEO.DLL
EXPORTS
NYCgeo@8
然后我更新了我的 Makevars.win.in
文件,该文件也在我的 src
目录中:
GBAT_PATH = @GBAT_PATH@
GBAT_DLL = @GBAT_DLL@
PKG_LIBS = -L"$(GBAT_PATH)/Bin" -l$(GBAT_DLL)
PKG_CPPFLAGS = -I"$(GBAT_PATH)/Include"
ifeq "${R_ARCH}" "/i386"
$(SHLIB): $(OBJECTS) NYCGEO.a
NYCGEO.a: NYCGEO.def
$(DLLTOOL) -k -d NYCGEO.def -l NYCGEO.a -D "$(GBAT_PATH)/Bin/$(GBAT_DLL)" $(DT_ARCH)
endif
我现在可以在运行 Windows 的 32 位和 64 位计算机上编译该包。
关于c++ - 使用 Rcpp 构建包时处理修饰的外部二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39780653/