2012-03-25 14 views
0

私はextern "C"機能を持つCPPを持っています。それらがすべて1つのファイルに含まれていれば、すべてがうまくいきます。私は機能を組織的な目的のために別々のファイルに分割したいと思っています。extern "C"を持つ2つのファイルのC++ lnk2005エラー?

は、だから私はこれらの2つのファイルを持って言うことができます:

File_One.cpp

#pragma once 
#include "stdafx.h" 
#include <windows.h> 
#include "Functions.h" 
#include "Variables.h" 
#include <string> 
#include "File_Two.cpp" 

extern "C" 
{ 
    __declspec(dllexport) void MethodOne() 
    { 
     MethodTwo(); 
    } 
} 

File_Two.cpp

#pragma once 
#include "stdafx.h" 
#include <windows.h> 
#include "Functions.h" 
#include "Variables.h" 
#include <string> 

extern "C" 
{ 
    __declspec(dllexport) void MethodTwo() 
    { 
    } 
} 

私も私の異なる順序でヘッダを含め再配置しようとした、としていますfile_tone.cppのインクルード以外のfile_one.cppにヘッダをインクルードしませんが、私はいつも同じエラーを受け取ります。

1)エラーLNK1169:1つの以上の多重定義されたシンボルは

2)エラーLNK2005が見つかりました:_MethodTwoはすでに正確に私が間違っているのは何

File_One.obj

で定義されていますか? 修正するにはどうすればよいですか?

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

+0

通常、あるcppファイルを別のファイルに含めるのは良いことではありません。そうする場合は、インクルードされたcppファイルがコンパイルおよびリンクされていないことを確認する必要があります。 –

+0

私はあなたの助言を取り、ヘッダーファイルを作りました。 –

答えて

1

File_two.cppファイルをFile_one.cppファイルに含めると問題が発生する可能性があります。何が起こっているのは、File_two.cppFile_one.cppがコンパイルされ、リンクされているということです。しかし、File_two.cppFile_one.cppに含まれているため、リンカーはMethodTwoの2つのコピーを見ているため、どちらを使用するかを決めることはできません。

File_two.h:

extern "C" 
{ 
    __declspec(dllexport) void MethodOne() 
} 

をそして、その代わりに、次のとおりです

あなたはヘッダに宣言を移動する必要があります。

File_one.h:

extern "C" 
{ 
    __declspec(dllexport) void MethodOne(); 
} 

次に、それぞれの.cppファイルに自分の体を持つ関数を定義します。ソースファイルにextern "C"は必要ありません。