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

cul

我正在使用Windows 32位计算机来编译使用Rcpp开发并使用RStudio 1.0.28中的Rtools 3.4编译的R包。我不断收到有关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的Project Options有关。
  3. 过去一周我一直在检查现有文档。这篇文章这篇文章这篇文章描述了我遇到的问题。我的问题是,我不知道在哪里指定“ --kill-at”或“ --add-stdcall-alias”
  4. 我的软件包的全部重点是利用City Planning的地址解析软件的NYC部门我没有“仅仅”将二进制NYCgeo.dll“丢进去”。实际上,我的软件包的64位版本可以正常工作。我的问题是开发32位版本...特别是,NYCgeo.dll二进制文件中存在@ 8后缀,这会导致错误。
  5. NYCgeo.dll是C二进制文件。我没有使用Visual Studio。
  6. 您提到的上一个问题涉及为我的软件包的64位版本创建Makevars文件(再次感谢@Coatless提供有用的信息)。64位NYCgeo.dll二进制文件不包含@ 8后缀。

更新:我试图为这个问题创建一个更好的标题。这个问题与创建一个R包有关,该R包利用了另一软件的功能...就我而言,是地理编码软件。具体来说,我遇到的问题是地理编码软件的32位版本具有修饰的dll文件,而64位版本则没有。装饰的二进制文件包含@符号,这些符号会在编译期间触发错误。我的任务是设计一种对32位dll进行解混(不确定是否是一个真实的词)的方法,但不要理会64位dll。

非常感谢。

格蕾琴

cul

rJava包是了解如何应对装饰二进制难以置信的帮助。

我创建了一个def文件NYCgeo.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位计算机上编译该程序包。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用二进制文件自动执行deb程序包?

使用相同的程序包会污染已编译的二进制文件吗?

使用不同的软件包和构建标签构建多个二进制文件

在python包中包含外部二进制文件

使用 cmake + cpack 构建时如何签署 Windows 二进制文件和 NSIS 安装程序

如何获取用于在(.deb)程序包中生成二进制文件的编译器标志?

二进制程序包控制文件的字段标识符中的有效字符

从C程序构建新的二进制文件

如何使已经存在的Nix程序包中的二进制文件能够在另一个程序包中运行Shell脚本?

如何使用gccgo构建完整的go程序二进制文件?

使用 Expo 构建二进制文件会压缩应用程序的大小吗?

使用静态对象构建二进制文件

如何使用Cargo构建多个二进制文件?

使用qmake构建二进制文件的多个版本

二进制文件未使用调试信息构建

在Ubuntu 18.04中为Qt生成独立的二进制程序包

使用g ++构建二进制文件时,谁确定GLIBCXX_version?

在启动时加载程序二进制文件

使用ARM程序集读取二进制文件

直接使用二进制包

我自己的二进制文件处于调试模式“二进制文件未使用调试信息构建”

使用Dockerfile时找不到二进制文件

为什么在使用供应商目录中的依赖项与gopath中的依赖项进行构建时,go应用程序二进制文件的大小不同?

如何在Golang中的软件包中构建二进制文件?

构建它们后如何安装Swift软件包二进制文件?

在Windows上写R软件包构建二进制文件

被构建标签禁用的包仍然链接到二进制文件

如何从源代码构建的应用程序制作二进制文件或.deb文件?

如何使用rpmbuild从二进制tarball构建rpm包?