使用Rcpp构建包时处理装饰的外部二进制文件

时间:2016-09-29 21:56:29

标签: c++ r dll

我正在使用Window 32位机器来编译使用Rcpp开发的R软件包,并在RStudio 1.0.28中使用Rtools 3.4编译。我一直收到有关32位外部dll(NYCgeo.dll)中@符号的错误:

thefile.o:thefile.cpp :(。text + 0x913):未定义引用`_imp__NYCgeo @ 8' collect2.exe:错误:ld返回1退出状态

果然,当我在文本编辑器中打开32位NYCgeo.dll时,我发现了@ 8后缀。这很奇怪,因为当我开发64位版本时,64位NYCgeo.dll不包含@ 8后缀,我没有任何错误。无论如何,我读到了--kill-at命令,并想知道我将它包含在哪里。我尝试了RStudio的配置构建工具设置以及我的makevars.win.in文件,但没有运气。

对@Dirk的回复

  1. 根据要求更新了标题。
  2. 我正在使用Rtools从RStudio中编译包,所以我认为它可能与RStudio的项目选项有关。
  3. 过去一周我一直在检查现有文档。 This postthis postthis post描述了我遇到的问题。我的问题是我不知道在哪里指定" - kill-at"或" - add-stdcall-alias"
  4. 我的包的重点是利用NYC Dept of City Planning's geocoding software。我没有"只是扔#34;二进制NYCgeo.dll"混合。"事实上,我64-bit version of the package的工作正常。我的问题是开发32位版本...具体来说,NYCgeo.dll二进制文件中存在@ 8后缀导致错误。
  5. NYCgeo.dll是C二进制文件。我没有使用Visual Studio。
  6. 您提到的上一个问题涉及为我的软件包的64位版本创建Makevars文件(再次感谢@Coatless提供有用的信息)。 64位NYCgeo.dll二进制文件不包含@ 8后缀。
  7. 更新 我试图为这个问题创建一个更好的标题。问题涉及创建一个R软件包,它利用另一个软件的功能......在我的例子中,是地理编码软件。具体来说,我遇到的问题是32位版本的地理编码软件具有装饰的dll文件,而64位版本没有。装饰二进制文件包含@符号,在编译期间会触发错误。我的任务是设计一种方法来解码(不确定这是否是一个真正的单词)32位dll但是只留下64位dll。

    非常感谢。

    格雷

1 个答案:

答案 0 :(得分:3)

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位计算机上编译程序包。