c++ - 使用 Rcpp 构建包时处理修饰的外部二进制文件

标签 c++ r dll

我正在使用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

  1. 根据要求更新了标题。
  2. 我正在使用 Rtools 从 RStudio 中编译该包,因此我认为它可能与 RStudio 的项目选项有关。
  3. 过去一周我一直在检查现有文档。 This post , this post ,和 this post描述我遇到的问题。我的问题是我不知道在哪里指定“--kill-at”或“--add-stdcall-alias”
  4. 我的包的重点是利用 NYC Dept of City Planning's geocoding software 。我并没有“只是将二进制文件 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 后缀。

更新: 我试图为这个问题创建一个更好的标题。问题涉及创建一个 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/

相关文章:

c# - 如何在 C# 中处理 HANDLE 返回?

c++ - 是否可以在 C++ 中使用不同行大小的矩阵?

c++ - 初始化匿名 union 的语法

r - 如果我的数据不是时间序列而是大量文本行,应该使用什么代替 'lag'

css - 网络抓取(抓取)时, "li: nth-child (n)"如何将数字 n 增加 +1?

c++ - 无法找到过程入口点

c++ - 将 vector<cv::Point3f> 转换为 CV_32FC3 类型的 cv::Mat

c++ - ifstream:从文件中读取十进制格式和十六进制格式的整数值

r - 将字母向量拆分为大小相等的向量

c++ - 分析共享库中的重复代码链接