我正在使用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的回复
更新 我试图为这个问题创建一个更好的标题。问题涉及创建一个R软件包,它利用另一个软件的功能......在我的例子中,是地理编码软件。具体来说,我遇到的问题是32位版本的地理编码软件具有装饰的dll文件,而64位版本没有。装饰二进制文件包含@符号,在编译期间会触发错误。我的任务是设计一种方法来解码(不确定这是否是一个真正的单词)32位dll但是只留下64位dll。
非常感谢。
格雷
答案 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位计算机上编译程序包。