私の目標は、R で C++ コードを使用してパッケージを作成することです。
C++ コードを含む R パッケージの作成に関するチュートリアルhttp://www.stat.columbia.edu/~gelman/stuff_for_blog/AlanRPackageTutorial.pdfに従っています。コンパイルしてパッケージ化しようとしている特定のコードは、チュートリアルで説明されているとおりです。
R CMD SHLIB は .dll ファイルの作成に取り組んでいるようです。dyn.load() を使用して R にロードし、シミュレートされたデータでテストできます (チュートリアルで説明されているように)。
R CMD INSTALL が問題の始まりです。関連すると思われる2つの異なるエラーが発生した2つのことを行いました。
1) チュートリアルでは、NAMESPACE ファイルには次のコードが含まれているはずだと書かれています。
useDynLib(XDemo)
export(XDemoAutoC)
R CMD INSTALL が失敗すると、エラーが発生します。
inDL(x,as.logical(local), as.logical(now),...) のエラー: 共有オブジェクト 'C:/.../libs/i386/XDemo.dll' を読み込めません: Loadlibrary の失敗: 1% は有効な Win32 プログラムではありません
2) NAMESPACE ファイルの上記の行を削除すると、パッケージがインストールされます。R に正常にロードできますが、C++ で記述された関数への .C() 呼び出しを行う R 関数を使用しようとすると、別のエラーが発生します。
library(newpackage)
ls(package:newpackage)
[[1]] "XDemoAutoC"
Warning message:
In ls(package:newpackage) :
‘package:newpackage’ converted to character string
XDemoAutoC(c(1,2,3,4))
Error in .C("DemoAutoCor", OutVec = as.double(vector("numeric", OutLength)), :
C symbol name "DemoAutoCor" not in load table
Windows 64 ビットでバージョン R2.15.2 を実行し、R64 ビットを使用しています。
同様の問題で次の投稿を読みました: http://r.789695.n4.nabble.com/Include-C-DLL-error-in-C-symbol-name-not-in-load-table-td3464021。 html
名前空間の問題については何も言及していないことを除いて。
また、この投稿を読みました: dyn.loadを使用してR x64でコンパイルされたcコードをロードする際の問題
だから私は考えています: Rx64 で dyn.load() を使用できるという事実に基づいて、x64 .dll を正常に作成したことを意味します。NAMESPACE ファイルがチュートリアルのように残されることになっていると仮定すると、>>not in load table<< エラーが修正されることを願っています - これは、問題 1 の修正に集中する必要があることを意味します。この問題は、32 ビットに関連する何かによって引き起こされているようです。.dll ファイルで Dependency Walker を使用しましたが、結果の解釈方法がわかりません
私は本当にこの問題を解決する方法について何のアイデアも持っていないので、何をすべきかについての提案は大歓迎ですか?