gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:21 25 4
gpt4 key购买 nike

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

thefile.o:thefile.cpp:(.text+0x913): undefined reference `_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 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 package 对理解如何处理装饰二进制文件非常有帮助。

我创建了一个名为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com