2

C にはメインプログラムはありません。確かに、C プログラマーは int main(int argc char *argv[]) で始めますが、これが機能するのは、コンパイラ/IDE に main という名前の関数を最初に実行するように指示するルーチンがあるためです。

ただし、MinGW でこのルーチンを見つけることができないようです。どこで定義されていますか?変更して(テストとしてのみ)少しいじってみたかったので、検索しました。MinGW フォルダー内の正しいファイルにリンクしてもらえますか?

4

1 に答える 1

1

リンカーはld、PE ファイルをリンクするときにエントリ ポイントとして使用するいくつかのシンボルのいずれかに一致するものを探します。

entry point              subsystem
---------------------   --------------

NtProcessStartup           native
WinMainCRTStartup          Windows GUI
mainCRTStartup             Windows CUI (console)
__PosixProcessStartup      POSIX CUI
WinMainCRTStartup          WinCE GUI
mainCRTStartup             Xbox
mainCRTStartup             other

DllMainCRTStartup@12 (or possibly DllMainCRTStartup) for DLLs

MinGW には、実際の PE エントリ ポイントを持つオブジェクト ファイルが自動的にリンクされます。-v- gcc のオプションを使用して、どのオブジェクト ファイルが自動的にリンクされているかを確認できます。

コンソール サブシステムの「hello world」プログラムを構築する MinGW 4.6.1 を使用した簡単なテストでは、エントリ ポイントを含むオブジェクト ファイルがあり、エントリ ポイントとしてリンカによって選択されるcrt2.oシンボルが含まれています。mainCRTStartup

エントリポイント コードを含むソース ファイルはcrtexe.c(またはcrtdll.c) です。

--entryリンカーのオプションを使用してエントリ ポイントをオーバーライドできます( Wl,--entry=whatevergcc コマンド ラインで使用する場合)。

于 2013-05-09T15:34:34.667 に答える