web-dev-qa-db-ja.com

mingw-w64を使用して32ビットWindows実行可能ファイルをコンパイルしてリンクするには

私はUbuntu 13.04を使用しており、apt-get install mingw-w64を使用してmingw-w64をインストールしています。次のコマンドで、私のプログラムの64ビットバージョンをコンパイルしてリンクできます。

x86_64-w64-mingw32-g++ code.cpp -o app.exe

これにより、64ビットのapp.exeファイルが生成されます。

32ビットバージョンのapp.exeを生成するには、どのバイナリフラグまたはコマンドラインフラグを使用しますか?

25
user103935

これは、現在使用しているツールチェーンのバリアントによって異なります。 [〜#〜] dwarf [〜#〜][〜#〜] seh [〜#〜の両方]バリアント(GCC 4.8.0以降)は単一ターゲットのみです。ディストリビューションのディレクトリ構造を調べると、自分で確認できます。つまり、64ビットと32ビットのどちらかではなく、両方のアドレス指定を持つライブラリのみが含まれています。一方、プレーンな古い[〜#〜] sjlj [〜#〜]ディストリビューションは確かにデュアルターゲットであり、32をビルドするためにビットターゲット。-m32フラグを指定するだけです。それが機能しない場合は、i686-w64-mingw32-g++でビルドしてください。

ボーナス


ちなみに、対応する3つのダイナミックリンクライブラリ(DLL)は、各GCC例外モデル

  1. libgcc_s_dw2-1.dll(DWARF);
  2. libgcc_s_seh-1.dll(SEH);
  3. libgcc_s_sjlj-1.dll(SJLJ)。

したがって、現在のMinGW-w64ディストリビューションが正確に提供している例外モデルを見つけるには、次のいずれかを実行できます。

  1. それらのDLLの1つ(通常はbin内)を見つけるために、MinGW-w64インストールのディレクトリとファイル構造を検査します。または
  2. 例外処理を含む実際のまたはテストC++コードをビルドして、これらのDLLの1つとのリンケージを強制し、ビルドされたターゲットが依存するDLLがどれであるかを確認します(たとえば、 Dependency Walker onで確認できます)ウィンドウズ);または
  3. ブルートフォースアプローチをとり、いくつかのテストコードを(マシンコードではなく)アセンブリにコンパイルし、___gxx_personality_v*(DWARF)、___gxx_personality_seh*(SEH)、___gxx_personality_sj*(SJLJ)などの参照の存在を探します。 ; 現在のGCC例外モデルの取得 を参照してください。
34