LNK2019について

解決


BLUE  2004-08-06 03:24:49  No: 54127

VC++.NETでコンソールアプリケーションを作成しているのですが、
ビルド時に、あるリンクエラーが表示されてしまい、右往左往しています。
すみませんが、ヒントを頂けたら幸いです。

あるリンクエラーというのは、
「LIBCMTD.lib(crt0.obj):error LNK2019 未解決の外部シンボル _mainが関数 _mainCRTStartupで参照されました。」
というエラーです。

いろいろネットなどで調べて試してみたのですが、どうしてもでてしまいます。[プロパティーページ]の[特定のライブラリの無視]に追加しても上記のリンクエラーがでてしまいす。

初心者の質問ではありますが、宜しくお願い致します。


瀬戸っぷ  2004-08-06 04:27:31  No: 54128

> 「LIBCMTD.lib(crt0.obj):error LNK2019 未解決の外部シンボル _mainが関数 _mainCRTStartupで参照されました。」

作成されたアプリケーションにmain()関数は無いのでしょうか???


BLU  2004-08-06 04:30:06  No: 54129

返答ありがとうございます。

>作成されたアプリケーションにmain()関数は無いのでしょうか???

main()は宣言してあります。
何も処理は記述していませんが。

それが、まずいですか???


BLUE  2004-08-06 04:32:29  No: 54130

すみません。
少し付けたしますと、

クラスを作成し、関数を宣言したところでリビルドしました。


Ban  2004-08-06 04:55:38  No: 54131

「宣言」だけだとまずいでしょう。
コンパイラは宣言があれば満足しますが、
リンカは実際の定義を要求します。


BLUE  2004-08-06 04:58:38  No: 54132

>リンカは実際の定義を要求します。

すみません。実際の定義とは何を指しますか?

定義=宣言ではないのですか?

初心者の質問ですが宜しくお願い致します。


BLUE  2004-08-06 05:06:41  No: 54133

すみません。すこし、付け加えます。

testヘッダーファイルにクラスを作成し、関数の宣言をしました。
その後、testソースファイルにtestヘッダーファイルをインクルードして、
関数の側だけを作成し(処理は何も書いていません。)、リビルドを行いました。

説明不足かもしれませんが、ヒントの方を宜しくお願い致します。


Ban  2004-08-06 05:08:46  No: 54134

BLUE さんがどちらの意図で書かれたのかは分かりませんが、
C の用語としては、関数定義 != 関数宣言です。

int main(int argc, char* argv[]);  // 宣言

// 定義
int
main(int argc, char* argv[])
{
  return 0;
}


Ban  2004-08-06 05:21:00  No: 54135

基本的に、クラスや関数の有無は現状の問題とは関係ありません。

コンソールの実行ファイルをビルドするにはグローバルのスコープに必ず一つ、
int main(int, char* []);     # または int main();
という名前の関数定義が必要です。(内部処理が return 0; だけでも構いません)

> main()は宣言してあります。

エラーの内容は、正しい main が見つからないというメッセージなのですが、
BLUE さんの'宣言している' main はどうなっていますか。

# ちなみに、LIBCMTD.lib というのは、Multi-Thread(MT) / Debug(D)用の
# C の標準ライブラリなので、普通これを無視することはできません。


BLUE  2004-08-06 05:26:11  No: 54136

ありがとうございます。

mainは戻り値なしなので

void クラス::main()
{
}

としています。

現在はLIBCMTD.libは無視しないようにしています。

上記のような、メイン処理では、いけないのでしょうか???


BLUE  2004-08-06 05:33:10  No: 54137

すみません。質問は宣言でしたね。
メインの宣言は、
void main(void);
です。

宜しくお願い致します。


Ban  2004-08-06 05:36:23  No: 54138

Java などとは違い、C++ が起動時に呼び出す main は
あくまでグローバルのものです。
クラスの中や namespace の中に main を書いても
それは対象になりませんので、それらに属さないグローバルの
main が別に必要です。

C++ ではどこのクラスにも属さない関数が記述できますので、
適当なソースの中にそういった main を用意してください。

# VC は void でも動きますが、正しい言語仕様としては
# main は int を返します。
# main の中では、return を省略すると 0 を返す仕様に
# なっていますので、できれば int にすることをお勧めします。


B  2004-08-06 05:43:41  No: 54139

ありがとうございます。

すみませんが、適当なソースの中にmainを用意すると言うのは、
新たに、ヘッダーファイルとソースファイルを用意するという事ですか?

以上。
お願い致します。


Ban  2004-08-06 05:53:11  No: 54140

新規で用意しても構いませんし、
test ソースの中でもかまいません。
ヘッダも特に無くて平気です。

int
main(int argc, char* argv[])
{
   return 0;
}

これを、test ソースに貼り付ければ、
とりあえずエラーは消えると思います。
# argc, argv が使われていない、
# という警告は出るかも。

その後で、BLUE さんが書いたクラスを
呼び出したいのであれば、この main の中に
そういった記述を追加してあげてください。

そうしないと、C++ はこの空の main だけを
実行して即座に終了してしまいます。


BLUE  2004-08-06 06:07:11  No: 54141

解決致しました。

とても親切に教えて頂きありがとうございます。

最後に1点だけ教えてください。

>main(int argc, char* argv[])

は、パラメータとして、何を指定しているのですか???

(int argc, char* argv[])の意味が少しわかりません。

グローバル関数として、必ず、このパラメータを指定しなければ
ならないのですか???

お願い致します。


Ban  2004-08-06 06:14:10  No: 54142

最初の数字は、プログラムの起動時に渡す引数の数です。
# プログラム名も一つに数えます。

二つ目は、引数に渡した文字列のポインタへの配列です。
例えば、argv[0]には、プログラムの名前が入ります。
# フルパスかどうか等は OS に依存します。

#include <iostream>
int main(int argc, char* argv[])
{
  for(int n=0; n < argc; ++n)
  {
    std::cout << argv[n] << std::endl;
  }

  return 0;
}

これを実行して、作ったプログラムに色々引数を渡してみれば、
何が入ってくるか分かりやすいかと思います。

これ以上の詳細は、C / C++ の書籍などを読んでみてください。


REE  2004-08-06 06:16:35  No: 54143

>main(int argc, char* argv[])
では、argcとargvに起動時の引数が入ります。
引数を特に必要としない場合であれば、以下の様に省略できます。

int main()
{
}


Ban  2004-08-06 06:17:43  No: 54144

回答が漏れました。
グローバルの main は必須ですが、引数については

> # または int main();

と書いたように、特に使わなければ省略することは可能です。
C++ の場合、C とは異なり宣言の ()内に何もない場合は
(void)と一緒です。


B  2004-08-06 06:17:53  No: 54145

ありがとうございました。

上記のようなプログラムを実行し、
今後も勉強していきたいとおもいます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加