2014-12-04 44 views
3

我想構建一個R包,它通過.Call調用一些C子程序。用C代碼構建R包,DLL缺失

所有的功能工作正常,如果我手動做R CMD SHLIB,然後dyn.load .dll文件。

現在,我正在構建包含R CMD構建的包。

我把所有的C代碼放在src文件夾裏,和我添加的一些庫的.h文件一起。當我運行[R CMD建立NAMEPACKAGE一切似乎都很正常,但是當我運行[R CMD檢查NAMEPACKAGE我收到以下錯誤:

*** arch - i386 
Error in library.dynam(lib, package, package.lib) : 
    DLL 'NAMEFUNC' not found: maybe not installed for this architecture? 
Error: loading failed 
Execution halted 
*** arch - x64 
Error in library.dynam(lib, package, package.lib) : 
    DLL 'NAMEFUNC' not found: maybe not installed for this architecture? 
Error: loading failed 
Execution halted 
ERROR: loading failed for 'i386', 'x64' 

我試圖讓互聯網上的一些信息,我有感覺我應該編寫一個Makevars文件,但老實說,我花了很多時間在Writing R擴展教程(1.2.1)上,我真的很難理解我需要做什麼。 有人請親自向我解釋如何解決問題?考慮我想將我的軟件包提交給CRAN。謝謝。

+0

你有你的C代碼在你的包的src'目錄或只是DLL? – cdeterman 2014-12-04 17:12:45

+0

其實我只有c代碼,我想我明白了,出於便攜性的原因,我沒有編譯c代碼之前,因爲否則dll應該只適用於我自己的操作系統...或者我錯誤? – user2960323 2014-12-04 21:08:28

+0

你是對的,有趣的是,如果構建工作正常,檢查會給出這些錯誤。鑑於您打算提交給CRAN,您是否願意將其放在github上?如果我們可以查看您的軟件包結構和NAMESPACE等文件,將更容易排除故障。 – cdeterman 2014-12-05 14:14:04

回答

1

我剛剛發現問題是什麼!這是(像往常一樣)一個相當愚蠢的事情,我不知道即使你用特定名稱調用某個函數,關聯的dll也會自動使用包名稱而不是函數本身調用,就像它一樣當你通過R CMD SHLIB創建你的dll時會發生。 因此,在NAMESPACE中,我不得不添加useDynLib(NAMEOFPACKAGE)而不是useDynLib(NAMEOFFUNCTION)。