62989


ファイルのオープンをするためのプログラムですがエラーが出てしまいます。一行目のincludeはそこで初めて定義したのにもかかわらず、既に定義されていると出てしまいます。ほかのプログラムを打っても同様のことが起こります。意味を調べてもいまいち理解できませんでした。かみ砕いて教えていただけないでしょうか。エラーは一番下に記載しておきます。

**ソースコード**

[code]

    #include <stdio.h>
    
    int main(void) {
        FILE *fp;
        fopen_s(&fp, "C_Gengo.txt", "w");
    
        printf("ファイルをオープンし、ファイルポインタfpに情報を格納しました\n");
    
        return 0;
    }
    
[/code]

**エラーメッセージ**

[code]

    LNK2005 main は既に Source.obj で定義されています。  
    
[/code]


CC BY-SA 4.0
2020-02-12T05:44:27.263
62987
2020-02-12T06:20:43.707
2020-02-12T06:01:14.440
19110
34680
question
c
エラーの理由を教えてください：LNK2005 main は既に Source.obj で定義されています。


LNK2005はリンク時に検出されるエラーです。  
本件では、アプリケーションのエントリーポイントであるmain()関数が複数発見されたため、エラーとなりました。  
すなわち、対象の実行ファイルを作成するときにリンクした一つ以上の*.objファイルにそれぞれmain()関数が含まれていたことを示唆しています。  
つまり以下のような状態です。

(1)Source.cpp にmain()が含まれていた。コンパイラこれをコンパイルしてSorce.objを作成した。  
(2)Other.cpp にもmain()が含まれていた。コンパイラこれをコンパイルしてOther.objを作成した。  
(3)リンカは、上記Source.objとOther.objをリンク(結合してアドレスを解決)しようとした。  
(4)両方に同じ名前のmain()関数があるためLNK2005が発生した。

さて、この様な事態が発生する原因としてはいくつか考えられます。

(A)Source.cpp、Other.cppの両者にmain()関数が「誤って」記述してある。  
(B)main()関数をヘッダーファイルであるmain.hに記述し、Source.cpp、Other.cppはこれをインクルードした。

一般的にはこの二つがありがちかもしれません。

(C)リンク時に使用したライブラリにmain()関数が存在した。

(プロジェクトの等の設定の間違い等)も考えられなくはないですが、一般にはそれほど発生する機会は無いと考えられます。  
以上の点を見直してみてはいかがでしょう。


CC BY-SA 4.0
2020-02-12T06:11:20.573
62988
2020-02-12T06:19:59.467
2020-02-12T06:19:59.467
3793
3793
62987
answer


エラーの意味は１つのプログラム（プロジェクト）中に `main()`
という関数が複数個ある、ということです。で、エラーメッセージやソース内容や過去の質疑応答から妄想するに（妄想ですが確度は高そう）  
\- Visual Studio 20xx を Windows 上で使っている  
\- C / C++ コンソールアプリプロジェクトを新規作成している  
\- あなたの書いたソースコードをそのプロジェクトに追加→新しい項目している  
と、書かれたようなエラーが発生します。

コンソールアプリプロジェクトを作るときに Visual Studio は `main()`
を含むソースファイルを自動生成しています。それに更に追加→新しい項目→ C/C++ ソースして、その中にも `main()` を書くと `main()`
が２個となりエラーになります。

対処法はいくつか考えられますが、一番手っ取り早そうなのは  
\- Visual Studio が自動生成したソースファイルを変更する（新規追加しない）  
でしょう。後生大事にとっておくべき内容は書かれていませんので問題ないです。


CC BY-SA 4.0
2020-02-12T06:20:43.707
62989
2020-02-12T06:20:43.707
8589
62987
answer