• 締切済み

コンパイルエラーの意味

最近プログラミングの勉強を始めた初心者です。作成したプログラムをコンパイルしたところ以下のようなエラーが出ましたがなんのエラーなのかまったく分かりません… 初歩的な質問で申し訳ありませんが教えてください! /user/lib/libcygwin.a(libcmain.o)(.text+0x6a):libcmain.c: undefined reference to'WinMain@16' collect2: ld returned 1 exit status

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

やはりmain関数を定義していないことが原因です。GUIプログラムであるかどうかは関係ありません。 以下難しい話になりますが、一応説明します。 Cygwinでは、 スタートアップ → main → WinMain の順に呼び出すようになっているのですが、main関数を定義していないと、ライブラリ内のmainが勝手に使われて、そこからWinMainを呼び出そうとします。 ISO/IEC 14882:2003の3.6.1 Main functionには、 An implementation shall not predefine the main function. とあるので、厳密に言えばこれは規格違反なのですが、Windowsに対応するためのやむを得ない処置と考えられます。

opca
質問者

お礼

ご回答ありがとうございます。 main関数を定義するのを忘れていました。13行目のvoidのあとに加えればいいのかな…? 丁寧な説明ありがとうございました!

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

内容というより質問の仕方自体も初心者ですね。 どういう環境で、どういうプログラムを作って、どのようなコマンドでコンパイルしたら こうなりました。 くらいは書かないと。 で、#1の方と同じくcygwinを使ったWindows上でコンパイルしたものと推測します。 作成したプログラムはWindowsのメッセージボックスを出すとか そんな感じのプログラムじゃないですか? >gcc --target-help Target specific options: -mthreads Use Mingw-specific thread support -mnop-fun-dllimport Ignore dllimport for functions -mdll Generate code for a DLL -mconsole Create console application -mwin32 Set Windows defines -mno-win32 Don't set Windows defines -mwindows Create GUI application -mno-cygwin Use the Mingw32 interface ということで、Windows GUI用プログラムということを指定してみてくださいな。 しかし初心者がWindows GUIプログラム作るのにcygwin gcc使うの?

opca
質問者

補足

ご回答ありがとうございます。確かに質問の仕方が意味不明でした。すみません。 環境は環境はcygwinのgccを使っています。 作ったプログラミングはタグが含まれる文字列を解析するもので、以下のように作成しました。 #define MAXELMNUM 256 typedef struct { char *tag; int depth; char *value; } ELEMENT; char *parse_ml_data(char *, int); ELEMENT elmtbl[MAXELMNUM]; int elmnum = 0; void parse_ml_string(char *mlstr) { while(*mlstr != '\0'){ mlstr = parse_ml_data(mlstr + 1, 1); } } char *parse_ml_data(char *mlstr, int level) { /*開始タグ処理*/ elmtbl[elmnum].tag = mlstr; elmtbl[elmnum].depth = level; for (; *mlstr != '>'; mlstr++); *mlstr = '\0'; /*タグの値処理*/ elmtbl[elmnum].value = mlstr; for ( *mlstr++; *mlstr != '<'; mlstr++); *mlstr = '\0'; elmnum++; /*下位のタグ構造処理*/ while(*(mlstr + 1) = '<') mlstr = parse_ml_data(mlstr + 1, level + 1); /*修了タグ処理*/ for (mlstr += 2; *mlstr != '>'; mlstr++); return mlstr + 1; }

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

書いてあるとおりです。 `WinMain@16`というシンボルを参照しようとしたけれども、定義されていないのでリンクエラーになっています。 エラーメッセージからCygwinのようですが、考えられる可能性はWinMainまたはmainを定義していないからです。ただし、正確なところはソースを見なければ分かりません。