1

Cで書かれたサードパーティのソースファイルと対応するヘッダー(GSLなどの宣言とインクルードディレクティブを含む)があります。基本的にRcppを使用して関数のラッパーを作成し、これらのソースファイルの周りにRパッケージを構築しようとしています。問題は、これらのファイルに C++ 標準の一部ではない制限修飾子が含まれているため、R CMD INSTALL がパッケージをコンパイルできないことです。.c ファイルには C コンパイラを使用しますが、.h ファイルを C++ コンパイラでコンパイルしようとすると失敗します。ヘッダー ファイル (.cpp ファイルに含まれています) に restrict が見つかると失敗します。

私は C やコンパイラのこと、Rcpp などにあまり詳しくないので、ここで何が最善のアプローチになるのかわかりません。

最も簡単な方法は、おそらく restrict キーワードを削除することです。これは私が現在行っていることです(ヘッダーファイルから制限を削除して.cファイルのままにしておくと、R CMD INSTALLが機能することに驚いています)。ただし、.c および .h ファイルは、R 以外の環境 (実行可能ファイルおよび Python) でも使用されるため、変更しません。すべてのプロジェクトで同一のファイルを使用すると便利です。

また、コンパイルが C++ コンパイラで行われた場合に関数定義から restrict を「削除」するように、空のキーワード restrict を定義しようとしましたが、その作業を行うことができませんでした。私はどこかで同様のアプローチについて読みましたが、明らかにそのようには機能しません。

特定の.hファイルをCコンパイラでコンパイルする必要があることを(Makevarsなどを介して)コンパイラに伝えることができればうまくいきますか?または、これらの関数を呼び出す C++ 関数で問題が発生しますか?

または、これらの関数が C++ ラッパーを介して R から呼び出された場合、キーワード全体がパフォーマンスの面で問題になりますか?

1 つのことは、Rcpp を捨てて、R からの .Call の代わりに .C を使用することですが、ここではパフォーマンスが重要であるため、.Call の方が高速である (そして信頼性が高い) ことを理解しているため、これは良い選択肢ではありません。 )。

最終的に、このパッケージは CRAN への道を見つける可能性があるため、ソリューションはかなり移植可能であることに注意してください。制限のための C++ コンパイラ固有のキーワードがいくつかあるようですが、移植性のためにそれらはオプションではないと思います。

4

1 に答える 1

3

#include <x.h>xh を使用する C ヘッダーである .cpp ファイルを作成しているようですrestrict。それが本当なら、.cpp ファイルを変更してこれを行うことができると思います。

#define restrict // nothing
extern "C"
{
#include <x.h>
}

次に、C++ コードのコンパイルではrestrictキーワードが表示されextern "C"ません。また、ヘッダー自体が内部でそれを行わない場合は、C++ コンパイラが C++ の「名前マングリング」を適用しないようにする必要があるため、ヘッダーをラップしました。内部で宣言された関数に。

于 2014-10-04T08:06:27.870 に答える