web-dev-qa-db-ja.com

GCCで最適化してリリースモードでビルドするにはどうすればよいですか?

GCCで完全に最適化された「リリースモード」で構築する必要がある特定のオプションは何ですか?複数のオプションがある場合は、それらすべてをリストしてください。ありがとう。

15
Polaris878

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

「1つのサイズですべてに対応」というものはありません。バイナリの正しいサブセットを決定するには、アプリケーション、要件、および最適化フラグを理解する必要があります。

またはあなたが望む答え:-O3

19
Josh

これは私が定期的に使用するMakefileの一部です(この例では、fooという名前のプログラムをビルドしようとしています)。

$ make BUILD=debugまたは$ make debugのように実行すると、DebugCFLAGSが使用されます。これらは最適化をオフにし(-O0)、デバッグシンボル(-g)を含みます。

これらのフラグを(追加のパラメーターなしで$ makeを実行して)省略すると、最適化がオンになっているReleaseCFLAGSバージョンがビルドされます。 (-O2)、デバッグシンボルが削除され(-s)、アサーションが無効になりました(-DNDEBUG)。

他の人が示唆しているように、特定のニーズに応じて、さまざまな-O*設定を試すことができます。

ifeq ($(BUILD),debug)   
# "Debug" build - no optimization, and debugging symbols
CFLAGS += -O0 -g
else
# "Release" build - optimization, and no debug symbols
CFLAGS += -O2 -s -DNDEBUG
endif

all: foo

debug:
    make "BUILD=debug"

foo: foo.o
    # The rest of the makefile comes here...
20
Wernsey

Gccには、MSVCのような「リリースモード」と「デバッグモード」がないことに注意してください。すべてのコードは単なるコードです。さまざまな最適化オプション(-O2と-Oは、非常に微調整を行っていない限り、一般的に気にする必要がある唯一のオプション)の存在は、生成されたコードを変更しますが、他のABI準拠との相互運用性を妨げる方法ではありませんコード。一般的に、リリースしたいものを最適化する必要があります。

「-g」オプションが存在すると、生成されたファイルに拡張シンボルとソースコード情報が配置されます。これはデバッグには役立ちますが、ファイルのサイズが大きくなります(そしてソースコードが明らかになります)。これはよくあることです。 「リリースされた」バイナリは必要ありません。

しかし、それらは排他的ではありません。最適化とデバッグ情報を使用してバイナリをコンパイルすることも、どちらも使用しないバイナリをコンパイルすることもできます。

9
Andy Ross

-O2は、スペースと速度のトレードオフを必要としないすべての最適化をオンにし、最も頻繁に使用される傾向があります。 -O3は、速度のトレードオフのためにいくらかのスペースを実行します(関数インラインなど)。-Osは、O2に加えて、コードサイズを削減するために他のことを実行します。これにより、キャッシュの使用が改善され、O3よりも高速になります。 (それがあなたのために働くかどうか確かめるためにテストしてください。)Oスイッチのどれも触れないオプションがたくさんあることに注意してください。それらが省略されている理由は、多くの場合、作成しているコードの種類に依存するか、アーキテクチャに大きく依存するためです。

4
stonemetal