web-dev-qa-db-ja.com

mingw-w64インストーラーのオプションの意味

MinGW-W64オンラインインストーラには、選択できるフィールドがいくつかあります。しかし、これに関するドキュメントを見つけることができず、私が行った推測では、私が望んでいる動作が得られません。

明らかに多くの作業がこのプロジェクトに費やされているので、基本的なドキュメントの不足によって受け入れが妨げられているのは残念に思えます。

「バージョン」フィールドと「アーキテクチャ」フィールドは一目瞭然ですが、問題がある他のフィールドは次のとおりです(現在のインストーラーの時点で表示されている値)。

  • スレッド、オプションposixおよびwin32
  • 例外、オプションdwarfおよびsjlj
  • ビルドリビジョン、オプション012

以前のインストールで選択した値は、win32seh、および1でした(それ以降、オプションが変更されたことは明らかですが、私は何が賢明ではありません)。

各オプションの長所と短所、特にスレッドモデルと例外処理、および「最良」のバージョンは何ですか?

x86_64-win32-seh-rev1を使用して遭遇した特定の問題は次のとおりです。

  • std::threadおよびstd::condition_variableはサポートされていません
  • デバッグ時(IDEとしてCode :: Blocksを使用)、例外がスローされた場合、例外ハンドラーにジャンプしません。 [次の行]を選択すると、何も3回実行されず、実行が中止されます。

デバッグの問題に対処することはできますが、C++ 11スレッドが機能するのは本当に素晴らしいことです。

39
M.M

例外

つすべてのモデル(ドワーフ、sjlj、およびseh)に対するこの回答 を参照してください。

スレッド

使用するスレッドの種類(POSIXスレッドまたはWindows APIスレッド)を決定できます。 posixスレッドには移植性の利点があります。コードを他のposixプラットフォーム(Linuxなど)で変更せずに使用できます。 win32スレッドAPIはWindows専用です。 Windowsを100%使用していて、APIのようなものであれば問題ありません。

std::threadのような新しいC++機能を使用する場合、スレッド化のための標準APIがすでにあるため、影響はあまり目立ちません。 posix-/win32スレッドapiを直接使用しない場合、本当に大きな違いがあるかどうかはわかりません(多分std::threadネイティブハンドル?)

参照: mingw-w64 threads:posix vs win32

ビルドリビジョン

Mingw(-w64)はGCCバージョン(4.8.x、4.9.xなど)に従うため、これは別のバージョン番号だと思います。特定のビルドが必要ない場合は、最新バージョンを使用する必要があります。

スレッドの問題

スローされる例外が次の場合:

terminate called after throwing an instance of 'std::system_error'
  what():  Enable multithreading to use std::thread: Operation not permitted

それからちょうどlinkpthreads-そして問題は解決しました。


勧告

特定のオプションを使用する理由がない場合。私の個人的な推薦:

posix - dwarf - 2
  • PosixC++ 11 <thread><mutex>および<future>を有効にする
  • dwarfは高速です
  • 2これは最新リリースであるため
22
ollo