none
Visual Studio 2015 エラーLNK2019 RRS feed

  • 質問

  • 初めまして、プログラム入門者です。今C言語を学習しているのですが、特に問題無く進んでいました。しかし、今回はLNK2019エラーが出て先に進まなくなりました。for文を使ったら急にこのエラーが出ました。コンパイルはできましたが、デバッグがだめでした。SDLチェックを外してもダメでした。scanf関数を使った時も出たので調べるとscanf_sにするかSDLチェックを外す事で対処可能だったのでscanf_s関数でうまくいきました。コードは

    #include<stdio.h>

    void main(){

    int i;

    for(i=1;i<=5;i++){

    printf(''%d'',i);

    }

    printf(''\n'');

    }

    エラーは、

    未解決の外部シンボル_WinMain@16が関数''int_cdecl invoke_main(void)''(?invoke_main@@YAHXZ)で参照されました。

    です。サイトで学習しています。コードもサイトと全く同じです。

    • 編集済み corn_891 2016年2月4日 13:55
    2016年2月4日 11:51

回答

  • C言語の学習とのことですが、ファイルの拡張子は .c でしょうか? .cpp はC++言語という別の言語です。

    またmain関数の戻り値はvoidではなくintです。この点は参照されているサイトも間違っています。

    • 回答の候補に設定 佐祐理 2016年2月5日 6:50
    • 回答としてマーク 星 睦美 2016年2月19日 8:02
    2016年2月4日 12:27

すべての返信

  • C言語の学習とのことですが、ファイルの拡張子は .c でしょうか? .cpp はC++言語という別の言語です。

    またmain関数の戻り値はvoidではなくintです。この点は参照されているサイトも間違っています。

    • 回答の候補に設定 佐祐理 2016年2月5日 6:50
    • 回答としてマーク 星 睦美 2016年2月19日 8:02
    2016年2月4日 12:27
  • 色々サイトを見たのですがC++ではCも使えるとあるのですが、どうなのでしょうか?
    2016年2月4日 14:06
  • C とか C++ は門外漢の自分がレスするのは何ですが。

    > 色々サイトを見たのですがC++ではCも使えるとあるのですが、どうなのでしょうか?

    ひょっとしたら「色々サイト」が言っているのは、基本的な言語仕様(例えば、「プログラミング言語 C 第 2 版」や「プログラミング言語 C++ 第 2 版」に書いてあるようなこと)の範囲での話ではないかと思いますが・・・

    その範囲であれば C++ は C のスーパーセットという話は聞いたことがありますが、マイクロソフトが独自に拡張した部分まで含めるとそういう話にはならないと思います。


    #ちなみに、自分が持っている「プログラミング言語 C 第 2 版」に書いてある標準ライブラリには scanf_s というメソッドは含まれていません(scanf ならありました)。「プログラミング言語 C++ 第 2 版」の方には見当たりません。Visual C++ 独自では?

    2016年2月5日 1:10
  • WinMain()が参照されているので、プロジェクトが

     「Win32プロジェクト」

    に設定されているのではないでしょうか。
    main()を使用する場合は、

     「Win32コンソールアプリケーション」

    を選択して、やり直してみてはどうでしょう。

    2016年2月5日 1:18
  • C++言語はある程度C言語の上位互換を持っていますが完全に同じというわけではありません。何らかの問題が生じた際に本来のC言語とC++言語の互換機能との差異によるものなのか、それとも別の問題なのか、区別が付けられないのであれば、あえて互換を選択することは難易度をあげる行為でしかありません。
    # 例えばC++言語でのみ予約語となっているthis、new、deleteなどはC言語では普通に変数名・関数名として使えます。C++言語では当然ながら構文エラーとなります。他にも差異はいろいろとあります。

    なお、「SDLチェックを外して」との記述がありましたが、これは新規プロジェクトの作成を行っているということでしょうか? ダイアログ名を明示していただいた方が的確に伝わります。その上の部分、Win32 アプリケーション ウィザードの[アプリケーションの種類]として「コンソールアプリケーション」を選択する必要があります。
    # 既に存在するプロジェクトに対してはプロジェクトのプロパティの操作にてサブシステムの指定としてCONSOLE(もしくは未設定)を選択することでもできます。

    2016年2月5日 1:22
  • ということで、

    佐祐理 さんからの
    >main関数の戻り値はvoidではなくintです
    でソースコードを修正し、

    仲澤@失業者 さんからの
    >「Win32コンソールアプリケーション」
    設定でプロジェクトを作り直してみて、

    その結果をフィードバックしてみてください。

    2016年2月5日 3:06
  • ソースファイルの拡張子をc.にした所、上手くいきました。scanf関数に関してはサイトの追記にscanf_sに変更されているという記述がありましたのでそれで知りました。scanf関数は通常のセキュリティ上の理由でVisual Studio 2012/2013ではscanf_sに変わっているとサイトにはありましたのでVisual独特の機能のようです。このサイトはc言語が分かった上でc++について書いているようです。なので情報が少し古かったりしているのかも知れません。皆さんありがとうございました。
    2016年2月5日 6:34
  • 最初に指摘した通り、やはり拡張子の問題でしたか。

    scanfscanf_sについてはドキュメントにもあるようにCRT のセキュリティ機能の違いであり、scanfのまま使い続けるために警告を除去する方法も説明されています。この機能自体はVisual Studio 2005の新機能ということで登場して既に10年経過しています。

    なお、C++言語では(C言語互換としてscanfも使用できますが、本来は)scanfではなくstd::cinを使用します。

    2016年2月5日 6:50
  • そうだったんですね、教えて頂きありがとうございます( ´ ▽ ` )ノ
    2016年2月6日 5:46