2011-06-28 28 views
4

我從Matlab創建的dll擴展。然後,我想讀R中的dll。如何與R中的DLL接口?

我用dyn.load()但它不起作用。

願意給我一些建議嗎?

+1

在我頭頂,這似乎不太可能工作。你想做什麼?你*可能*能夠將這個調用打包成一段C代碼,然後可以正確鏈接並調用R ... –

回答

0

需要更多信息。常規方法是這樣的:

dyn.load(「/ path/to/library」);

一些指針:

  • 確保庫的架構是正確的(例如,「x86_64的」 VS「I386」 VS「的ARMv7」)
  • 確保你沒有嘗試加載在Windows上的基於UNIX的機器「的.dll」(「所以」,「名爲.dylib」)
+1

嗯。這真的會起作用嗎?我會有點驚訝,如果一個Matlab編譯的DLL有正確的接口從R調用...我猜如果你確切地知道預期的調用協議是什麼(即所有變量的類型和順序)它可以工作。 PS,原始海報:你能提供更多關於什麼「不起作用」的含義嗎?你嘗試了什麼,錯誤信息是什麼......? –

+0

這是錯誤dyn.load(「sta.dll」,F)#全局加載inDL(x,as.logical(local),as.logical(now),...)中的錯誤:無法加載共享對象'C:/Users/grojas/Documents/sta.dll':LoadLibrary失敗:指定的模塊找不到。 – Guaner

+0

'file.exists(「C:/Users/grojas/Documents/sta.dll」)是否等於'TRUE'? (也許你只是沒有正確設置你的工作目錄?試試'setwd([適當的目錄])'或'dyn.load(file.choose())'? –

1

基於以下@馬里奧的回答評論跟帖討論:我會建議你試試比較你做了(R CMD SHLIB DLL與Matlab DLL),以幫助診斷問題。基於這個結果,我認爲你需要弄清楚dll的調用語法是在C語言中,然後爲它編寫一個小的C語言包裝器,它使用這個語法,但又是R CMD SHLIB -able ... R CMD SHLIB --help說你可以在命令行中包含鏈接器選項(例如,確保您將Matlab可調用的dll與R可調用的dll鏈接起來),但我不確定其確切的語法。這可能有助於研究R擴展手冊的相關部分。

2

用什麼語言編寫的源代碼?

麻煩的是混合編譯器。 Matlab dll很可能是由Visual Studio構建的。 而且,當函數標識符變得錯亂時,您無法在不同的編譯器之間混合使用C++代碼。您可以通過一些工作混合使用C對象代碼。 MinGW網站上有一些常見問題。