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++ コンパイラ固有のキーワードがいくつかあるようですが、移植性のためにそれらはオプションではないと思います。