C言語のundefined reference to WinMainを直す|main関数がない原因
C言語のコードを実行したとき、undefined reference to 'WinMain' や main is not defined と表示されることがあります。どちらも、実行を始めるための main 関数が見つからないときに起きるエラーです。この記事では、同じコードをWindows版GCC 16.1.0とAI Work Studioで試し、環境による文言の違いと直し方を確認します。
結論
このエラーが出たら、コード内に int main() があるか確認します。別の関数だけを書いても、その関数は自動では実行されません。main 関数を追加し、その中から必要な処理を始めれば直せます。
int main() {
printf("Hello from C\n");
return 0;
}
発生している問題
次のコードには、文字を表示する greet 関数があります。しかし、プログラムの開始点となる main 関数がありません。
修正前コード
#include <stdio.h>
void greet() {
printf("Hello from C\n");
}
Windows版GCC 16.1.0ではリンク時に終了コード1となり、エラーの主要部分に次の文言が出ました。
undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status
AI Work Studioでは、Consoleに次の文言が表示されました。
<position unavailable> method main is not defined in $global
文言は異なりますが、同じ修正前コードで「実行を始めるmain関数がない」状態を両方で再現できました。
原因
C言語の完成した実行プログラムには、処理の開始点となる main 関数が必要です。GNU C Language Manualのmain関数の説明でも、完全な実行プログラムは main を必要とし、実行はそこから始まると説明されています。
GCCはソースコードを機械語へ変換した後、リンカーを使って実行ファイルを作ります。GNU ld公式ドキュメントでは、リンカーはオブジェクトやライブラリを結び、シンボル参照を解決すると説明されています。greet 関数は定義されていても、開始に必要なシンボルが見つからないため、リンク段階で止まります。
Windows用GCCでは起動処理の都合で WinMain、AI Work Studioでは main と表示されました。エラー名だけで別の問題と決めず、まず main 関数の有無を確認するのが近道です。
修正後コード
今回は greet を残さず、表示処理を main 関数へ入れます。
#include <stdio.h>
int main() {
printf("Hello from C\n");
return 0;
}
実行結果
修正後はGCCとAI Work Studioの両方で終了コード0となり、標準出力は次の1行で完全に一致しました。
Hello from C
AI Work StudioのConsoleには、この出力に続いて 終了コード: 0 も表示されました。標準入力は空のまま、Previewは表示内容なしです。
よくある間違い
greetをmainへ名前変更するだけで戻り値を書かない
void greet() を main() に変えるだけでは、戻り値の型がありません。初心者向けの短いプログラムでは int main() と書き、最後に return 0; を置く形にすると分かりやすくなります。
ファイル名をmain.cにすれば直ると思う
大切なのはファイル名ではなく、コード内の関数名です。ファイルが main.c や main.cpp でも、main 関数がなければ今回の問題は直りません。
WinMain関数を自分で追加する
通常のConsole向けC練習で、いきなりWindows専用の WinMain を書く必要はありません。まず標準的な int main() を追加し、通常のCプログラムとして実行してください。
AI Work Studioで試す手順
- AI Work Studioを開きます。
C / C++タブを選びます。- 修正前コードを貼り付け、「C/C++を実行」を押します。
- Consoleに
main is not definedが含まれることを確認します。 - 修正後コードへ置き換え、もう一度実行します。
Hello from Cと終了コード: 0が表示されれば成功です。
まとめ
undefined reference to 'WinMain' や main is not defined が出たら、実行開始点の main 関数を確認します。補助関数を書いただけでは処理は始まりません。int main() を追加して実行した結果、GCCとAI Work Studioの両方で Hello from C を確認できました。