2016-09-29 58 views
2

我使用一個Window 32位機編譯使用Rcpp開發的R包,並在RStudio 1.0.28中使用Rtools 3.4進行編譯。我不斷收到關於32位外部DLL(NYCgeo.dll)中的@符號的錯誤:使用Rcpp構建包時處理裝飾的外部二進制文件

thefile.o:thefile.cpp :(.text + 0x913):未定義對`_imp__NYCgeo @ 8'的引用 collect2.exe:錯誤:ld返回1退出狀態

果然,當我在文本編輯器中打開32位NYCgeo.dll時,發現@ 8後綴。這很奇怪,因爲當我開發64位版本時,64位NYCgeo.dll不包含@ 8後綴,並且我沒有任何錯誤。無論如何,我讀了關於 - 技能 - 命令,並想知道我會在哪裏包括它。我嘗試了RStudio的Configure Build Tools設置以及我的makevars.win.in文件,但沒有運氣。

響應@Dirk

  1. 更新標題的要求。
  2. 我正在使用Rtools編譯RStudio中的軟件包,所以我認爲它可能與RStudio的Project Options有關。
  3. 我已經花了上週檢查現有的文檔。 This post,this postthis 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後綴。

UPDATE: 我試圖創建這個問題更好的標題。這個問題涉及到創建R軟件包,該軟件包利用了另一個軟件的功能......在我的例子中是地理編碼軟件。具體來說,我遇到的問題是32位版本的地理編碼軟件具有裝飾的dll文件,而64位版本則沒有。裝飾二進制文件包含@符號,這些符號會在編譯期間觸發錯誤。我的任務是設計一種方式來對32位dll進行demangle(不確定這是否是一個真正的單詞),但只保留64位dll。

非常感謝。

格雷

+0

感謝您擴大問題。你應該來到rcpp-devel郵件列表:低容量,主要是耐心的回覆,比這裏更多的Rcpp用戶。你的問題是一個難題。 –

+0

這就是說,對於一個[給定的dll附近的類似包](https://github.com/Rblp/Rblpapi/)我使用了兩個上游DLL,每個32和64位。 –

回答

3

rJava包是瞭解如何應對裝飾二進制難以置信的幫助。

我創建了一個名爲NYCgeo.def DEF文件,在我src目錄保存它:

LIBRARY  NYCGEO.DLL 

EXPORTS 
    [email protected] 

然後我更新了我的Makevars.win.in文件這也是我src目錄:

GBAT_PATH = @[email protected] 
GBAT_DLL = @[email protected] 

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位機器上編譯軟件包。

相關問題