AI AIワークナビ AI Work Studio
メニュー
AIワークナビ ホーム

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.cmain.cpp でも、main 関数がなければ今回の問題は直りません。

WinMain関数を自分で追加する

通常のConsole向けC練習で、いきなりWindows専用の WinMain を書く必要はありません。まず標準的な int main() を追加し、通常のCプログラムとして実行してください。

AI Work Studioで試す手順

  1. AI Work Studioを開きます。
  2. C / C++ タブを選びます。
  3. 修正前コードを貼り付け、「C/C++を実行」を押します。
  4. Consoleに main is not defined が含まれることを確認します。
  5. 修正後コードへ置き換え、もう一度実行します。
  6. Hello from C終了コード: 0 が表示されれば成功です。

まとめ

undefined reference to 'WinMain'main is not defined が出たら、実行開始点の main 関数を確認します。補助関数を書いただけでは処理は始まりません。int main() を追加して実行した結果、GCCとAI Work Studioの両方で Hello from C を確認できました。

関連記事