特定の gcc ビルドについて、ビルドされているスイッチを見つける方法はありますか? ソース コードから gcc ビルドをビルドする場合、いくつかの特定の機能を使用できるかどうかを決定するスイッチがいくつか
あると聞きました。スレッドと他のものはそうではありません、または例外を処理するビルドとビルド(それらが何のためにあるのかさえわかりません!すべての場合でビルドが15%遅いことだけを知っています!
)これらについて、そしておそらくこの点に関してより多くの情報を知る必要がありますか?Thread_posix
Win32_thread
MingW
Windows
sjlj
dwarf
sjlj
質問する
1219 次
2 に答える
6
はい。の出力にgcc -v
は、知りたいことがすべて表示されます。
例外は次のとおりです。
- ドワーフ:
--enable-dw2-exceptions
- sjlj:
--enable-sjlj-exceptions
4.8 より前の 64 ビット MinGW-w64 GCC の場合は何もありません。 - seh:
--enable-seh-exceptions
または GCC 4.8+ 64 ビット MinGW-w64 GCC の場合は何もありません。
これらは、libgcc DLL 名から推測できます。この名前には常に、、、または が含まsjlj
れdw2
ますseh
。
libgcc で使用されるスレッド実装:
- win32: デフォルト、オプション
--enable-threads=win32
- posix:
--enable-threads=posix
私の知る限り、これらはファイル名から推測することはできません。
于 2013-04-19T11:24:23.323 に答える
2
Windows では、最近の GCC バージョン (4.8 以降) を使用すると、次のようになります。
例外処理モデルの場合
dwarf/sjlj/seh
:- win32 ターゲット ビルド
- 為に
dwarf2
--with-dwarf2
指定する必要があります
- 為に
sjlj
--enable-sjlj-exceptions
指定する必要があります--disable-sjlj-execptions
sjlj
例外処理を強制的に無効にしたい場合にも使用できます
- 為に
- win64 ターゲット ビルド
- 為に
seh
- 何も指定する必要はありません。を使用しない場合のデフォルトです
sjlj
。
- 何も指定する必要はありません。を使用しない場合のデフォルトです
- 為に
sjlj
--enable-sjlj-exceptions
指定する必要があります--disable-sjlj-execptions
sjlj
例外処理を強制的に無効にしたい場合にも使用できます
- 注:
win64
configure スクリプトに例外処理引数が渡されなかった場合のデフォルトはseh
exception です。
- 為に
- win32 ターゲット ビルド
スレッド モデルの場合
win32/posix
:- 為に
win32
--enable-threads=win32
指定する必要があります- 注:
win32
スレッド関連の引数が configure スクリプトに渡されなかった場合のデフォルトのスレッド モデルです。
- 為に
posix
--enable-threads=posix
指定する必要があります
- 為に
既に構築された MinGW GCC の例外処理モデルを理解するには:
- 調べている MinGW GCC が以下を使用して構築された場合
--enable-shared
bin
フォルダはDLLとして持ってlibgcc
いますlibgcc
DLL には、使用されている例外処理モデルを示すプレフィックスがあります。dw2/seh/sjlj
- 調べている MinGW GCC が を使用して構築された場合、
--disable-shared
もう少し複雑になり、次のいずれかの方法を使用できます。strings
とコマンドの組み合わせを手動で使用grep
して、静的からそれを把握しますlibgcc.a
。<GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a
今回は、例外処理モデルのプレフィックスがありません。strings <GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a | grep personality
出力には次のいずれかが含まれます。sjlj
:__gcc_personality_sj0
dwarf2
:__gcc_personality_v0
seh
:__gcc_personality_seh0
- 例外処理モデルを示す GCC によって定義されたマクロを手動でチェックします(好ましくない)
g++ -dM -E -x c++ - < /dev/null
次のいずれかが存在する必要がありますsjlj
:#define __USING_SJLJ_EXCEPTIONS__ 1
seh
:#define __SEH__ 1
dwarf2
:(#define __GCC_HAVE_DWARF2_CFI_ASM 1
これについてはよくわかりません)
于 2020-08-12T12:53:37.043 に答える