ほとんどの環境でWindows用にビルドする場合、実際のプログラムエントリポイントは小さなランタイムライブラリの関数によって提供されます。これは、いくつかの環境準備を行い、main、wmain、WinMainなどのユーザが提供する関数を呼び出します。
ユーザが提供するメイン関数の前に実行されるコードには、グローバルC++コンストラクタの実行、TLS変数の有効化、標準的なライブラリ呼び出しがマルチスレッド環境で適切に動作し、標準のロケールを設定するなど、グローバルな相互排他性を提供します。
エントリーポイントを設定することの1つは、エントリーポイントに付けた名前の未定義のシンボルでリンカーを開始することです。たとえば、mingw32を使用している場合、リンカーはリンクする必要があると仮定しますlibmingw32.a
と未定義の記号__tmainCRTStartup
との間にある。
リンカはlibmingw32.a
で(たぶん)__tmainCRTStartup
を見つけ、余分な大きさはどこから来るのであるcrtexe.o
から発せられる未定義のシンボルを満たすために必要な何か、と一緒に、それを含むオブジェクトファイルcrtexe.o
が含まれます。
独自のエントリポイントを設定するときは、これをオーバーライドし、指定した関数を探すようにリンカを設定するだけです。より小さな実行可能ファイルが得られますが、使用している機能がランタイムの起動機能によって実行されるグローバル初期化に依存しないように注意する必要があります。
ビルド元は何ですか?ビルド手順は何ですか? – andlabs
私自身のソースですが、基本的に単純なWin32ウィンドウで十分です。 ウィンドウハンドル、MessageLoopなど 私は間違っているかもしれませんが、私は深さのテストはしていませんが、サイズの違いの原因を簡単に伝えることができると思いました。私は多くのものがファイルで参照され、実装されていると仮定することができます(リリースビルドモードでも)。それは、どこかで私が個人的に使うのではないことを意味します。 注目に値するのは静的ライブラリです。だから私はWinMainがCRLの多くを追加するか何かを強制すると推測しています。 – Zerowalker