アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

/user/lib/libcygwin.a(libcmain.o)(.text+0x6a):libcmain.c: undefined reference to'WinMain@16'
collect2: ld returned 1 exit status

A 回答 (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に対応するためのやむを得ない処置と考えられます。
    • good
    • 1
この回答へのお礼

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

お礼日時:2008/03/26 14:49

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



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

で、#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使うの?

この回答への補足

ご回答ありがとうございます。確かに質問の仕方が意味不明でした。すみません。
環境は環境は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;
}

補足日時:2008/03/26 12:44
    • good
    • 0

書いてあるとおりです。


`WinMain@16`というシンボルを参照しようとしたけれども、定義されていないのでリンクエラーになっています。

エラーメッセージからCygwinのようですが、考えられる可能性はWinMainまたはmainを定義していないからです。ただし、正確なところはソースを見なければ分かりません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!