Rパッケージを構築するときに、静的ライブラリとリンクする方法
-
06-09-2019 - |
質問
私は、次のロジックを使用して、私は、私は、このアプリケーションを使用して専門家ではないR(統計プログラム)によって使用されようとしているパッケージを作成していますが、私は非常に単純なパッケージを作成するために管理していますコードはRコンパイラを使ってコンパイルする必要があり、それが唯一のCコードを可能にするように、C ++でのいくつかのクラスは、私はC ++のメソッドを呼び出すラッパーCコードを持っている、と後で私はCで公開されたメソッドを呼び出すRスクリプトを持っていますコードので、基本的にRのような通信は< - > C < - > C ++
私は、このパッケージを作成するために使用される完全なチュートリアルが発見されたこちら、私はそれを参照として追加します。
今、私の問題は、私は私が何をする必要があるか、私はすでに作成したパッケージにいくつかの機能を追加する必要があるということである私が作成し、それが使用して登録されている他の製品であるCOMオブジェクトへの遅延バインディング用のコードを追加することですます。regasmツールます。
これは私がCOMオブジェクトに遅延バインディングにしようとする使用しているのC ++コードで、私はそうするのIDispatchを使用しようとしている。
{
...
CLSID clsid;
HRESULT hr = CLSIDFromProgID((WCHAR*)"My Com object ProgId", &clsid);
if(FAILED(hr))
return;
...
}
唯一のコンパイラは、すでに私のトラブルを与えているこれらの行で、私がコンパイルに使用するコマンドは、であるため、私は、全体のコードを貼り付けていませんでした
R CMD SHLIB Cclass.cc C++class.cc
ここで "Cclass.ccは、" C ++の方法および "C ++ class.cc" を呼び出すCコードは、実際にはC ++コードでいる。
私は、コンパイラが言うこれらのクラスをコンパイルすると、
"undefined reference to `CLSIDFromProgID@8'collect2: ld returned 1 exit status"
私は "私は私の問題は、私は静的ライブラリですole32.libとoleaut32.libを含めていないよということであると考えている理由です、私は私が必要とするすべてのヘッダファイルを追加している確信しています。
だから、私の質問は、私はCLSIDFromProgID(...)またはのQueryInterface(...)のように、遅延バインディングのための方法を使用することができるようにするために、このライブラリを含めることができるか、です。また、誰もが私の問題は、このライブラリをリンクされていませんが、私の問題があってよいと私を指すことができれば何か他のものは、それは素晴らしいことだと考えています。
また、私は私が間違っていないよ場合は、単にCコンパイラであるRコンパイラによって問題なく、彼らはコンパイルすることができるような方法でそれらの静ライブラリとリンクする必要が念頭に置いています。
解決
私はC / C ++とFortranのではなく、むしろでこれをやってみましたいませんでした。私はいくつかの標準的なIOライブラリは、私が作成したライブラリに含まれていなかったという点で同様の問題がありました。最後に、私はちょうどそれらすべてを含めおよびFortranコンパイラを使用してコンパイル。私は何か他のものを使用するため、通常の静的Fortranライブラリをコンパイルしているかのように私はちょうどコンパイルRコンパイラユーティリティ、のいずれかを使用していませんでした。これがうまく働いています。
デバッグパスはそれがRで試す動作するかどうか、その後、別のCプログラムからその静的ライブラリが含まれており、呼び出すしようその後、GCCを使用して、静的ライブラリとしてコンパイルする(または使用しているものは何でも)かもしれません。
あなたは私の知る限りバニラCまたはFortranを使用している場合を除き、これは便利ですホープ、これらのRパッケージを書くのはかなり難しいです。