2

特定の gcc ビルドについて、ビルドされているスイッチを見つける方法はありますか? ソース コードから gcc ビルドをビルドする場合、いくつかの特定の機能を使用できるかどうかを決定するスイッチがいくつか
あると聞きました。スレッドと他のものはそうではありません、または例外を処理するビルドとビルド(それらが何のためにあるのかさえわかりません!すべての場合でビルドが15%遅いことだけを知っています! )これらについて、そしておそらくこの点に関してより多くの情報を知る必要がありますか?Thread_posixWin32_threadMingWWindowssjljdwarfsjlj

4

2 に答える 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 名から推測できます。この名前には常に、、、または が含まsjljdw2ますseh

libgcc で使用されるスレッド実装:

  • win32: デフォルト、オプション--enable-threads=win32
  • posix:--enable-threads=posix

私の知る限り、これらはファイル名から推測することはできません。

于 2013-04-19T11:24:23.323 に答える
2

Windows では、最近の GCC バージョン (4.8 以降) を使用すると、次のようになります。

  1. 例外処理モデルの場合dwarf/sjlj/seh:

    • win32 ターゲット ビルド
      1. 為にdwarf2
        • --with-dwarf2指定する必要があります
      2. 為にsjlj
        • --enable-sjlj-exceptions指定する必要があります
        • --disable-sjlj-execptionssjlj例外処理を強制的に無効にしたい場合にも使用できます
    • win64 ターゲット ビルド
      1. 為にseh
        • 何も指定する必要はありません。を使用しない場合のデフォルトですsjlj
      2. 為にsjlj
        • --enable-sjlj-exceptions指定する必要があります
        • --disable-sjlj-execptionssjlj例外処理を強制的に無効にしたい場合にも使用できます
      • 注:win64 configure スクリプトに例外処理引数が渡されなかった場合のデフォルトはsehexception です。
  2. スレッド モデルの場合win32/posix:

    1. 為にwin32
      • --enable-threads=win32指定する必要があります
      • :win32スレッド関連の引数が configure スクリプトに渡されなかった場合のデフォルトのスレッド モデルです。
    2. 為にposix
      • --enable-threads=posix指定する必要があります

既に構築された MinGW GCC の例外処理モデルを理解するには:

  1. 調べている MinGW GCC が以下を使用して構築された場合--enable-shared
    • binフォルダはDLLとして持ってlibgccいます
    • libgccDLL には、使用されている例外処理モデルを示すプレフィックスがあります。dw2/seh/sjlj
  2. 調べている MinGW GCC が を使用して構築された場合、--disable-sharedもう少し複雑になり、次のいずれかの方法を使用できます。
    1. stringsとコマンドの組み合わせを手動で使用grepして、静的からそれを把握しますlibgcc.a<GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a今回は、例外処理モデルのプレフィックスがありません。
      • strings <GCC_buildroot>/lib/gcc/<target>/<version>/libgcc.a | grep personality出力には次のいずれかが含まれます。
        1. sjlj:__gcc_personality_sj0
        2. dwarf2:__gcc_personality_v0
        3. seh:__gcc_personality_seh0
    2. 例外処理モデルを示す GCC によって定義されたマクロを手動でチェックします(好ましくない)
      • g++ -dM -E -x c++ - < /dev/null次のいずれかが存在する必要があります
        1. sjlj:#define __USING_SJLJ_EXCEPTIONS__ 1
        2. seh:#define __SEH__ 1
        3. dwarf2:(#define __GCC_HAVE_DWARF2_CFI_ASM 1 これについてはよくわかりません)
于 2020-08-12T12:53:37.043 に答える