2012-03-25 3 views
0

extern "C"기능이있는 CPP가 있습니다. 파일이 모두 하나의 파일에 있으면 모든 것이 훌륭하게 작동합니다. 조직적인 목적으로 기능을 다른 파일로 분리하려고합니다.extern "C"가있는 두 파일에서 C++ lnk2005 오류가 발생하는 이유는 무엇입니까?

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() 
    { 
    } 
} 

, 심지어 :

그래서 나는이 두 파일이 있다고 할 수 있습니다 files_two.cpp에 대한 include가 아닌 file_one.cpp에 헤더를 포함시키지 말고 항상 같은 오류가 발생합니다.

1) 오류 LNK1169 : 하나 개 이상의 곱하기 정의 기호

2) 오류 LNK2005을 발견 : _MethodTwo 이미 정확히 내가 잘못 뭐하는 거지

File_One.obj

에 정의? 문제를 해결하려면 어떻게해야합니까?

감사합니다.

+0

하나의 cpp 파일을 다른 파일에 포함시키는 것은 일반적으로 좋지 않습니다. 그렇게한다면, 포함 된 cpp 파일이 컴파일되고 링크되어 있지 않은지 확인해야합니다. –

+0

당신의 충고를 받아서 헤더 파일을 만들었고 효과가있었습니다. –

답변

1

File_one.cpp 파일에 File_two.cpp 파일이 포함되어있어 문제가 많은 것 같습니다. 무슨 일이 일어나고 File_two.cppFile_one.cpp이 컴파일되고 링크되고 있습니다. 그러나 File_two.cppFile_one.cpp에 포함되어 있기 때문에 링커에서 MethodTwo의 복사본을 두 개보고있어 사용할 항목을 결정할 수 없습니다.

File_two.h:

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

을 그리고 그 대신에 포함

당신은 헤더에 선언을 이동해야합니다.

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

File_one.h:

그러면 각 .cpp 파일 신체와 기능을 정의한다. 소스 파일에 extern "C"가 필요 없습니다.