特定の gcc ビルドについて、ビルドされているスイッチを見つける方法はありますか? ソース コードから gcc ビルドをビルドする場合、いくつかの特定の機能を使用できるかどうかを決定するスイッチがいくつか
あると聞きました。スレッドと他のものはそうではありません、または例外を処理するビルドとビルド(それらが何のためにあるのかさえわかりません!すべての場合でビルドが15%遅いことだけを知っています!
)これらについて、そしておそらくこの点に関してより多くの情報を知る必要がありますか?Thread_posixWin32_threadMingWWindowssjljdwarfsjlj
1219 次
2 に答える
6
はい。の出力にgcc -vは、知りたいことがすべて表示されます。
例外は次のとおりです。
- ドワーフ:
--enable-dw2-exceptions - sjlj:
--enable-sjlj-exceptions4.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-execptionssjlj例外処理を強制的に無効にしたい場合にも使用できます
- 為に
- win64 ターゲット ビルド
- 為に
seh- 何も指定する必要はありません。を使用しない場合のデフォルトです
sjlj。
- 何も指定する必要はありません。を使用しない場合のデフォルトです
- 為に
sjlj--enable-sjlj-exceptions指定する必要があります--disable-sjlj-execptionssjlj例外処理を強制的に無効にしたい場合にも使用できます
- 注:
win64configure スクリプトに例外処理引数が渡されなかった場合のデフォルトはsehexception です。
- 為に
- win32 ターゲット ビルド
スレッド モデルの場合
win32/posix:- 為に
win32--enable-threads=win32指定する必要があります- 注:
win32スレッド関連の引数が configure スクリプトに渡されなかった場合のデフォルトのスレッド モデルです。
- 為に
posix--enable-threads=posix指定する必要があります
- 為に
既に構築された MinGW GCC の例外処理モデルを理解するには:
- 調べている MinGW GCC が以下を使用して構築された場合
--enable-sharedbinフォルダはDLLとして持ってlibgccいますlibgccDLL には、使用されている例外処理モデルを示すプレフィックスがあります。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_sj0dwarf2:__gcc_personality_v0seh:__gcc_personality_seh0
- 例外処理モデルを示す GCC によって定義されたマクロを手動でチェックします(好ましくない)
g++ -dM -E -x c++ - < /dev/null次のいずれかが存在する必要がありますsjlj:#define __USING_SJLJ_EXCEPTIONS__ 1seh:#define __SEH__ 1dwarf2:(#define __GCC_HAVE_DWARF2_CFI_ASM 1これについてはよくわかりません)
于 2020-08-12T12:53:37.043 に答える