Extconf.rbに追加のG ++最適化フラグを使用するように指示するにはどうすればよいですか?
-
23-10-2019 - |
質問
私は使用しています 米 Ruby GemのC ++拡張機能を作成します。拡張機能は、共有オブジェクト(.so)ファイルの形式です。
これには、「MKMF」ではなく「MKMF-Rice」が必要ですが、2つ(AFAIK)はかなり似ています。
デフォルトでは、コンパイラはフラグを使用します -g -O2
. 。個人的には、最適化を有効にすることでデバッグするのが難しいため、この種の愚かなことを見つけます。 MakeFileを編集して、気に入らない旗を取り出すことに頼りました(例えば、削除します -fPIC -shared
使用してデバッグする必要があるとき main()
ルビーのフックの代わりに)。
しかし、私はより良い方法がなければならないと思います。私はただできることを知っています
$CPPFLAGS += " -DRICE"
追加のフラグを追加します。しかし、makefileを直接編集せずに物事を削除するにはどうすればよいですか?
二次的な質問:Rubyによってロードされた共有オブジェクトにとって安全な最適化は何ですか?ようなことをすることはできますか -funroll-loops
?何をお勧めしますか?
それは科学的なコンピューティングプロジェクトなので、より速いほど良いです。メモリはそれほど問題ではありません。
どうもありがとう!
解決
迅速で汚い方法は、-O0をCXXFLAGSに追加することです。これにより、最適化がオフになります。後のオプションは以前のオプションをオーバーライドします。
プラグインの安全性に関しては、ABIに影響を与えないことは何でもできるはずです。テストがなければ、なぜ - フンロールがするのかわかりません。もちろん、SAFEはより良いことを意味するものではありません。 Man Pageが指摘したように、「-Funroll-Loopsはコードを大きくし、より速く実行する場合とそうでない場合があります。」
他のヒント
使用することを定義します
-D name=definition
あなたがあなたの例でするように:
$CPPFLAGS += " -DRICE"
-u名
-Dオプションが組み込まれている、または提供されている名前の以前の定義をキャンセルします。
$CPPFLAGS += " -URICE"
あなたが望むように、それが未定-O2を使用するのに役立つかどうかはわかりませんが。