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