VC++.NETでコンソールアプリケーションを作成しているのですが、
ビルド時に、あるリンクエラーが表示されてしまい、右往左往しています。
すみませんが、ヒントを頂けたら幸いです。
あるリンクエラーというのは、
「LIBCMTD.lib(crt0.obj):error LNK2019 未解決の外部シンボル _mainが関数 _mainCRTStartupで参照されました。」
というエラーです。
いろいろネットなどで調べて試してみたのですが、どうしてもでてしまいます。[プロパティーページ]の[特定のライブラリの無視]に追加しても上記のリンクエラーがでてしまいす。
初心者の質問ではありますが、宜しくお願い致します。
> 「LIBCMTD.lib(crt0.obj):error LNK2019 未解決の外部シンボル _mainが関数 _mainCRTStartupで参照されました。」
作成されたアプリケーションにmain()関数は無いのでしょうか???
返答ありがとうございます。
>作成されたアプリケーションにmain()関数は無いのでしょうか???
main()は宣言してあります。
何も処理は記述していませんが。
それが、まずいですか???
すみません。
少し付けたしますと、
クラスを作成し、関数を宣言したところでリビルドしました。
「宣言」だけだとまずいでしょう。
コンパイラは宣言があれば満足しますが、
リンカは実際の定義を要求します。
>リンカは実際の定義を要求します。
すみません。実際の定義とは何を指しますか?
定義=宣言ではないのですか?
初心者の質問ですが宜しくお願い致します。
すみません。すこし、付け加えます。
testヘッダーファイルにクラスを作成し、関数の宣言をしました。
その後、testソースファイルにtestヘッダーファイルをインクルードして、
関数の側だけを作成し(処理は何も書いていません。)、リビルドを行いました。
説明不足かもしれませんが、ヒントの方を宜しくお願い致します。
BLUE さんがどちらの意図で書かれたのかは分かりませんが、
C の用語としては、関数定義 != 関数宣言です。
int main(int argc, char* argv[]); // 宣言
// 定義
int
main(int argc, char* argv[])
{
return 0;
}
基本的に、クラスや関数の有無は現状の問題とは関係ありません。
コンソールの実行ファイルをビルドするにはグローバルのスコープに必ず一つ、
int main(int, char* []); # または int main();
という名前の関数定義が必要です。(内部処理が return 0; だけでも構いません)
> main()は宣言してあります。
エラーの内容は、正しい main が見つからないというメッセージなのですが、
BLUE さんの'宣言している' main はどうなっていますか。
# ちなみに、LIBCMTD.lib というのは、Multi-Thread(MT) / Debug(D)用の
# C の標準ライブラリなので、普通これを無視することはできません。
ありがとうございます。
mainは戻り値なしなので
void クラス::main()
{
}
としています。
現在はLIBCMTD.libは無視しないようにしています。
上記のような、メイン処理では、いけないのでしょうか???
すみません。質問は宣言でしたね。
メインの宣言は、
void main(void);
です。
宜しくお願い致します。
Java などとは違い、C++ が起動時に呼び出す main は
あくまでグローバルのものです。
クラスの中や namespace の中に main を書いても
それは対象になりませんので、それらに属さないグローバルの
main が別に必要です。
C++ ではどこのクラスにも属さない関数が記述できますので、
適当なソースの中にそういった main を用意してください。
# VC は void でも動きますが、正しい言語仕様としては
# main は int を返します。
# main の中では、return を省略すると 0 を返す仕様に
# なっていますので、できれば int にすることをお勧めします。
ありがとうございます。
すみませんが、適当なソースの中にmainを用意すると言うのは、
新たに、ヘッダーファイルとソースファイルを用意するという事ですか?
以上。
お願い致します。
新規で用意しても構いませんし、
test ソースの中でもかまいません。
ヘッダも特に無くて平気です。
int
main(int argc, char* argv[])
{
return 0;
}
これを、test ソースに貼り付ければ、
とりあえずエラーは消えると思います。
# argc, argv が使われていない、
# という警告は出るかも。
その後で、BLUE さんが書いたクラスを
呼び出したいのであれば、この main の中に
そういった記述を追加してあげてください。
そうしないと、C++ はこの空の main だけを
実行して即座に終了してしまいます。
解決致しました。
とても親切に教えて頂きありがとうございます。
最後に1点だけ教えてください。
>main(int argc, char* argv[])
は、パラメータとして、何を指定しているのですか???
(int argc, char* argv[])の意味が少しわかりません。
グローバル関数として、必ず、このパラメータを指定しなければ
ならないのですか???
お願い致します。
最初の数字は、プログラムの起動時に渡す引数の数です。
# プログラム名も一つに数えます。
二つ目は、引数に渡した文字列のポインタへの配列です。
例えば、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++ の書籍などを読んでみてください。
>main(int argc, char* argv[])
では、argcとargvに起動時の引数が入ります。
引数を特に必要としない場合であれば、以下の様に省略できます。
int main()
{
}
回答が漏れました。
グローバルの main は必須ですが、引数については
> # または int main();
と書いたように、特に使わなければ省略することは可能です。
C++ の場合、C とは異なり宣言の ()内に何もない場合は
(void)と一緒です。
ありがとうございました。
上記のようなプログラムを実行し、
今後も勉強していきたいとおもいます。
ツイート | ![]() |