3

R(統計プログラム)で使用されるパッケージを作成しています。私はこのアプリケーションを使用する専門家ではありませんが、次のロジックを使用して非常に単純なパッケージを作成できました。いくつかのクラスがありますC++ の場合、コードは R コンパイラを使用してコンパイルする必要があり、C コードしか許可されないため、C++ メソッドを呼び出すラッパー C コードがあり、後で C コードによって公開されたメソッドを呼び出す R スクリプトがあります。基本的にはR<->C<->C++のような通信です。

このパッケージの作成に使用した完全なチュートリアルはここにあります。参照として追加します。

今私の問題は、既に作成したパッケージにいくつかの機能を追加する必要があることです。私が作成し、regasm ツールを使用して登録された別の製品である COM オブジェクトに遅延バインディングするためのコードを追加する必要があります。

これは、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 コードがあり、「C++class.cc」は実際には C++ コードです。

これらのクラスをコンパイルすると、コンパイラは次のように言います

"undefined reference to `CLSIDFromProgID@8'collect2: ld returned 1 exit status"

必要なすべてのヘッダー ファイルを追加したと確信しています。そのため、静的ライブラリである ole32.lib と oleaut32.lib を含めていないことが問題であると考えています。

したがって、私の質問は、CLSIDFromProgID(...) や QueryInterface(...) などのレイト バインディングのメソッドを使用できるようにするために、このライブラリをどのように含めることができるかということです。また、私の問題がこのライブラリをリンクしているのではなく、他の何かであると誰かが信じている場合は、私の問題がどこにあるのかを教えていただければ幸いです。

また、Rコンパイラで問題なくコンパイルできるように、これらの静的ライブラリとリンクする必要があることも覚えておいてください.Rコンパイラは、私が間違っていなければ単なるCコンパイラです.

4

1 に答える 1