独自のRパッケージをインストール/ビルドするときに、~/.R/Makevars
およびpackage_directory/src/Makevars
で設定されたマクロ/変数の役割と関係を理解しようとしています。これらのファイルが次のように見えるとします
〜/ .R/Makevars
CXX = g++
CXXSTD = -std=c++11
CXXFLAGS = -fsanitize=undefined,address -fno-omit-frame-pointer
CXX98 = g++
CXX98STD = -std=c++98
CXX11 = g++
CXX11STD = -std=c++11
CXX14 = g++
CXX14STD = -std=c++14
package_directory/src/Makevars
PKG_CPPFLAGS = -I../inst/include
CXX_STD = CXX11
私が理解しているように、CXX
を使用すると、RパッケージをビルドするときにC++のコンパイラを選択できます。CXXSTD
を使用すると標準が選択され、CXXFLAGS
PKG_CPPFLAGS
を使用すると、C++プリプロセッサにフラグが追加され、CXX_STD
を使用すると、パッケージがC++ 11を使用することがわかります。
次の質問があります。
CXX
とCXX98
、CXX11
とCXX14
の関係は何ですか?CXX11STD = -std=c++11
の意味は何ですか? -std=c++11
と-std=gnu++11
の選択の間ですか? -std=gnu++11
は、一般的に移植性の理由で避けるべきですか?CXXSTD
およびCXXFLAGS
のフラグをCXX
に追加するだけでなく、最初の3行をCXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointer
に減らすことができますか。 CXXSTD
およびCXXFLAGS
を明示的に指定する利点は何ですか?CXX_STD = CXX11
はどのように機能しますか? CXX11
は、CXX11
の~/.R/Makevars
とどのように関連していますか?CXXFLAGS
とPKG_CXXFLAGS
(私の例には含まれていません)の関係は何ですか?R Extensionsの記述 および R Installation and Administration に含まれる情報を知っていますが、上記に答えるために現在の理解レベルを超える情報を抽出することはできません質問。
Rcpp
タグを追加しているのは、これらの質問への回答がRcpp
のユーザーに最も関連すると思われるためですが、これはおそらくRcpp
に直接関係しないことを認識しています。適切であると思われる場合、タグは削除される可能性があります。
R拡張機能の記述:1.2.1 Makevarsの使用 で指定されているMakevars
ファイルは、 Make
の変形であり、つまりuniqueto R.リストした変数の多くは 暗黙の変数 と呼ばれます。意味は次のとおりです。
暗黙のルールは、慣習的なテクニックの使用方法をmakeに指示するため、使用するときに詳細に指定する必要はありません。
これらの 暗黙的な変数 は、whatコンパイラを使用する必要があり、whatオプションが使用可能であることを示します。
[〜#〜] r [〜#〜]内では、次のデフォルトコンパイラオプションが重要です。
[〜#〜] cc [〜#〜]Cプログラムをコンパイルするためのプログラム。デフォルトは「cc」です。
[〜#〜] cxx [〜#〜]C++プログラムをコンパイルするためのプログラム。デフォルトは「g ++」です。
[〜#〜] cpp [〜#〜]Cプリプロセッサを実行するためのプログラムで、結果は標準出力に出力されます。デフォルトは「$(CC)-E」です。
[〜#〜] fc [〜#〜]FortranおよびRatforプログラムをコンパイルまたは前処理するためのプログラム。デフォルトは「f77」です。
次の一連の値の詳細whatオプションは、コンパイラで使用する必要があります。一般に、これらすべてのオプションのデフォルト値は空の文字列です。
[〜#〜] cflags [〜#〜]Cコンパイラに与える追加フラグ。
[〜#〜] cxxflags [〜#〜]C++コンパイラに与える追加フラグ。
[〜#〜] cppflags [〜#〜]Cプリプロセッサおよびそれを使用するプログラム(CおよびFortranコンパイラ)に与える追加フラグ。
[〜#〜] fflags [〜#〜]Fortranコンパイラに与える追加フラグ。
[〜#〜] ldflags [〜#〜]コンパイラがリンカー「ld」を呼び出すことになっているときにコンパイラに与える追加フラグ-L。代わりに、ライブラリ(-lfoo)をLDLIBS変数に追加する必要があります。
[〜#〜] ldlibs [〜#〜]コンパイラーがリンカー「ld」を呼び出すことになっているときにコンパイラーに指定されたライブラリーのフラグまたは名前。 LOADLIBESは、LDLIBSの非推奨の(しかし、まだサポートされている)代替です。 -Lなどの非ライブラリリンカーフラグは、LDFLAGS変数に入れる必要があります。
現在、[〜#〜] r [〜#〜]は、さまざまなC++ ISO標準の観点から「余分な」バリアントを定義しています。これらのバリアントは R管理:セクション2.7.2 C++サポート および R管理:セクションB.7コンパイルおよびロードフラグ
CXX98 CXX98STD CXX98FLAGS CXX98PICFLAGS
CXX11 CXX11STD CXX11FLAGS CXX11PICFLAGS
CXX14 CXX14STD CXX14FLAGS CXX14PICFLAGS
CXX17 CXX17STD CXX17FLAGS CXX17PICFLAGS
これを言ったので、最初の質問に取り組みましょう:
CXX
と_CXX98
_、_CXX11
_と_CXX14
_の関係は何ですか?
CXX
は、使用する一般的なコンパイラオプションです。一方、[〜#〜] r [〜#〜]は、検出されたコンパイル標準に応じて使用する追加のCXX
オプションを定義します。つまり、_-std=c++98
_(_CXX98
_言語仕様)が_CXX_STD
_によって設定されている場合、_CXX98
_に関連付けられたコンパイラーが使用されます。同様に、_CXX11
_および_CXX14
_についても、同じロジックが続きます。詳細については、「 Rcppギャラリー:C++ 11、C++ 14、およびC++ 17でのRcppの使用 」を参照してください。
たとえば、C++ 11がすでに暗示されている場合の_
CXX11STD = -std=c++11
_の意味は何ですか? _-std=c++11
_と_-std=gnu++11
_の選択の間ですか?移植性の理由から、一般的に_-std=gnu++11
_を避けるべきですか?
_CXX11STD
_の意味は、C++ 11コンパイルに適した言語標準を決定することです。このオプションが存在するのは、単に[〜#〜] r [〜#〜]の適切なC++ 11コンパイルオプションの選択のバージョンがコンパイラにとって正しくない場合、それを変更。これが存在する理由は、 R Installation and Administration:2.7.2 C++ Support :
[脚注13] C++ 11サポートに適したフラグがないことがあります。この場合、CXX11とその対応するフラグに異なるコンパイラを選択できます。
脚注13:
これは、4.2.1などのg ++の以前のバージョン、およびSolarisコンパイラCCの一般的に使用されるバージョンにも当てはまります。
Gccが承認した言語標準の詳細については、 GCCマニュアル:3.4 C方言を制御するオプション を参照してください。また、パッケージで[〜#〜] r [〜#〜]とともにC++ 11を使用する方法の詳細については、 R拡張機能の記述:セクション1.2.4を参照してください。 C++ 11コードの使用 。
通常、この変数を明示的に設定することは避けます。この変数を明示的に設定する必要がある場合は、ほとんどのコンパイラがこの宣言をサポートしているため、_-std=c++11
_を使用することをお勧めします。
CXXSTD
とCXXFLAGS
のフラグをCXX
に追加するだけでなく、最初の3行を_CXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointer
_に減らすことができますか。CXXSTD
とCXXFLAGS
を明示的に指定する利点は何ですか?
出来ますか?はい。正しいですか?番号。
three変数がそれぞれ独自の目標を持っているのに、単純に1つだけ持つことができるのはなぜですか?
three可変ワークフローの利点は、異なる行にそれぞれ異なる役割を提供します。これにより、コンパイルオプションをすばやく理解できます。したがって、grokを1行で1つの変数に詰め込んだ場合(終端幅80)で比較すると、grokの方がはるかに簡単です。
例えば.
_CXX = g++ -std=c++11 -fsanitize=undefined,address -fno-omit-frame-pointer
_
対
_CXX = g++
CXX11STD = -std=c++11
CXXFLAGS = -fsanitize=undefined,address -fno-omit-frame-pointer
_
さらに、 R拡張機能の記述:セクション1.2.4 C++ 11コードの使用 に示されているように、パッケージング時に_CXX_STD
_ over CXXSTD
を選択する必要があります。これは単に、RがC++ xyを必要とするパッケージを登録したことを確認するためです。別の方法は、DESCRIPTION
ファイルに属性_SystemRequirements: C++xy
_を書き込むことです。ここで、xy
は年を示します。
_
CXX_STD
_ = _CXX11
_はどのように機能しますか?ここで_CXX11
_は〜/ .R/Makevarsの_CXX11
_とどのように関係していますか?
これにより、_CXX11
_で設定されたC++ 11コンパイラで実行される言語のコンパイルとリンクが設定されます。 _CXX11
_を指定することにより、レシピの下でファイルをコンパイルするために使用される Make
の変数 を指定しています。
_$(OBJCXX) $(ALL_CPPFLAGS) $(ALL_OBJCXXFLAGS) -c $< -o $@
_
ここで、$(OBJCXX)
はCXX
、$(ALL_CPPFLAGS)
は$(R_XTRA_CPPFLAGS) $(PKG_CPPFLAGS) $(CLINK_CPPFLAGS) $(CPPFLAGS)
で与えられ、$(ALL_OBJCXXFLAGS)
は$(PKG_OBJCXXFLAGS) $(CXXPICFLAGS) $(SHLIB_CXXFLAGS) $(OBJCXXFLAGS)
を持ちます。
上記は _/R/Makeconf.in
_ に従います。ただし、ルーチンは _/m4/R
_ の場合があります。
CXXFLAGS
と_PKG_CXXFLAGS
_の関係は何ですか(私の例には含まれていません)?
これらは両方とも、コンパイラのコンパイルフラグを指定します。 Makevars
に書き込まれる順序は異なります。特に、 CXXFLAGS
がafter_PKG_CXXFLAGS
_ に配置されています。 rightmostオプションはalwaysが使用されます。したがって、CXXFLAGS
は_PKG_CXXFLAGS
_よりも優先されます。
R拡張機能の作成:セクション5.5共有オブジェクトの作成 に_PKG_*
_オプションに関する簡単な注意事項があります。
以下は、この応答のコメントセクションで@Dominikが尋ねた質問です。
_
~/.R/Makevars
_で定義された変数はすべてのパッケージのインストールにグローバルに適用され、_/src/Makevars
_の変数は現在のパッケージにのみ適用されるのは正しいですか?
はい。これは正確です。 _~/.R/Makevars
_内の変数はすべてのパッケージに適用されますが、各パッケージに同梱されている_/src/Makevars
_はそのパッケージの設定にのみ影響します。 _/src/Makevars
_の値は、_~/.R/Makevars
_よりも優先されます。
一部のパッケージには、Windows環境専用のMakevars
ファイルを提供する_/src/Makevars.win
_が付属している場合があります。
Gallery.rcpp.org/articles/simple-lambda-func-c++11に示されているように、現在、パッケージに使用されるコンパイル標準は_
CXX_STD
_を介してのみ設定され、_PKG_CXXFLAGS
_によって設定されることはありませんか?
これら2つのフラグを使用するタイミングにはわずかな違いがあります。特に、_CXX_STD
_はパッケージ環境でのみ動作します。一方、その名前に反して、_PKG_CXXFLAGS
_はすべてのコンパイルオプションに影響します。したがって、上記のRcppギャラリーの投稿を引用すると、スタンドアロンスクリプトが実行されていることがわかります。正しいモードにすばやく切り替えるには、_PKG_CXXFLAGS
_を設定し、not_CXX_STD
_定義を必要とします。
さて、standalone useコンパイルオプションの歴史について簡単に触れてください。.._PKG_CXXFLAGS
_の使用は少し古いです。実際、R 3.4で推奨されるアプローチは、環境変数_USE_CXX11 = "yes"
_を設定することです。 R 3.1とR 3.3の間では、標準は環境変数_USE_CXX1X = "yes"
_を設定することでした。それらのインスタンスの前は、_PKG_CXXFLAGS ="-std=c++11"
_の使用が好まれていました。 (_PKG_CXXFLAGS ="-std=c++0x"
_が必要なWindowsを除く。)
_
CXX_STD=CXX11
_を使用すると、CXX
、CXXSTD
、CXXFLAGS
、および_CXX11PICFLAGS
_で指定されたすべての設定を使用することになりますか?
いいえ。これは、次によって設定されたオプションを使用することを意味します。
CXX11 CXX11STD CXX11FLAGS CXX11PICFLAGS