gccldリンカーは、静的ライブラリをオブジェクト ファイル*.aとは少し異なる方法で処理します。*.o特に、スタティック ライブラリのシンボルは、以前にリンクされたオブジェクト ファイルまたは別のスタティック ライブラリで使用されない限り、最終的なバイナリ イメージ実行可能ファイルに含まれません。
さらに、静的ライブラリで渡す順序は にとって重要ですld。たとえば、 にlibb.aある関数が必要だとしますliba.a。次のようにリンクすると:
g++ -Wall example.cpp -o example.exe -la -lb
が処理されたときに、必要libaなシンボルが認識されない (まだ処理されていない)ため、これは解決できません。から取得される唯一のシンボルは、それまでに見たすべてのものです。-lblibbliba.a
何でこれが大切ですか?
上記のプロセスを質問に適用すると、WinMain解決されない理由が明らかになります。
g++ aa
ldプロセス時a.aに、「ああ、何も使用しWinMainていないので、含めません」と表示されます。その前に他のオブジェクトファイルが提供されていないため、それは処理のその時点まで当てはまります。
上に表示されていないのは、mingw には、デフォルトで、プログラムが動作するために必要な一連の重要なボイラープレート コードも含まれているということです。これらの 1 つは、crt0_c.oあなたのを呼び出すmingwmingw32.aランタイムの一部を構成するものです。WinMain
ソリューション
WinMainfroma.aが含まれていることを確認するには、次の 2 つの方法があります。
シンボルの解決に使用できるように-Wl,--whole-archive、すべてのシンボルを強制的に含めるa.aために使用します。後で追加して、後に続く-Wl,--no-whole-archive他のライブラリに誤って適用しないようにします。例えば。
g++ -o example.exe -Wl,--whole-archive a.a -Wl,--no-whole-archive
2 番目の方法は、soが処理されたときに保留中の未解決のシンボルになる前mingw32.aに手動で含めることです。 a.aWinMaina.a
g++ -o example.exe -lmingw32 a.a
また
g++ -o example.exe libmingw32.a a.a
ただし、おそらくパスを完全に修飾する必要がありますlibmingw32.a。そうしないと、リンカーがパスを見つけられません。