ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:opca コンパイルエラーの意味
困り度:
  • すぐに回答を!
最近プログラミングの勉強を始めた初心者です。作成したプログラムをコンパイルしたところ以下のようなエラーが出ましたがなんのエラーなのかまったく分かりません…
初歩的な質問で申し訳ありませんが教えてください!

/user/lib/libcygwin.a(libcmain.o)(.text+0x6a):libcmain.c: undefined reference to'WinMain@16'
collect2: ld returned 1 exit status
質問投稿日時:08/03/26 11:47
質問番号:3895829
最新から表示回答順に表示

回答

 

回答者:jacta やはり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に対応するためのやむを得ない処置と考えられます。
種類:回答
どんな人:専門家
自信:参考意見
回答日時:08/03/26 13:51
回答番号:No.3
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼ご回答ありがとうございます。
main関数を定義するのを忘れていました。13行目のvoidのあとに加えればいいのかな…?
丁寧な説明ありがとうございました!

回答

 

回答者:sakusaker7 内容というより質問の仕方自体も初心者ですね。

どういう環境で、どういうプログラムを作って、どのようなコマンドでコンパイルしたら
こうなりました。
くらいは書かないと。

で、#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使うの?
種類:回答
どんな人:経験者
自信:参考意見
回答日時:08/03/26 12:18
回答番号:No.2
この回答への補足ご回答ありがとうございます。確かに質問の仕方が意味不明でした。すみません。
環境は環境は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 書いてあるとおりです。
`WinMain@16`というシンボルを参照しようとしたけれども、定義されていないのでリンクエラーになっています。

エラーメッセージからCygwinのようですが、考えられる可能性はWinMainまたはmainを定義していないからです。ただし、正確なところはソースを見なければ分かりません。
種類:回答
どんな人:専門家
自信:参考意見
回答日時:08/03/26 12:09
回答番号:No.1
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示