2012-01-31 2 views
1

Windows VC++ 2008에서 프로그램 작업을하고 있습니다. 모든 코드를 .cpp 파일로 가져 와서 (모든 것을 작동 시키려면), 이제는 .h로 분해합니다. , .cpp 파일. 나는 그 진술 LNK2005 오류의 산을 얻을 컴파일 할 때 :LNK2005 추적 : "이미 정의 됨"

내가 선언되지 않은 식별자의 오류를 받고 계속 원래의 프로그램을 제작하고있는 동안
Object.obj : error LNK2005: "__thiscall thing::thing(args)" already defined in otherObject.obj 

그래서 나는 그것을 만족하는 include 지시문을 주었다. 이제는 모든 것을 .cpp 파일로 분리하고 .h 파일로이 모든 것을 얻을 수 있습니다. 어느 장소에서 (Object, otherObject, 또는 thing), 또는 다른 곳을보기 시작할 것인가.

+0

가능한 중복 [오류 LNK2005 : 이미 정의 된 - C++] (http://stackoverflow.com/questions/622229/error-lnk2005-already-defined-c) –

답변

3

기본적으로 하나의 정의 규칙 (ODR)을 위반하여 오류가 발생하여 2 개의 번역 단위 (TU)에 thing::thing(args)의 정의가 있으므로 오류가 발생합니다.
링커는 어떤 TU가 포함되어 있는지 정확히 알려줍니다 : otherObject.objObject.obj.

otherObject.cppObject.cpp과이 두 개의 cpp 파일에 포함 된 헤더를 살펴보십시오. 대개 사용자가 생성자 thing::thing(args)을 헤더 파일에 정의하고이 두 파일의 해당 헤더 파일을 포함하면 cpp 파일이 여러 정의가됩니다. 솔루션 제안

:

당신은 헤더 파일의 생성자를 정의 할 수 없습니다, 당신은 클래스의 다른 멤버 함수와 함께 당신의 cpp 파일에 추가해야합니다. 헤더에 생성자 정의를 추가해야한다면 코드를 표시하지 않았으므로 inline으로 표시해야합니다. 두 번째 방법을 적용 할 이유가 없습니다.

+0

그냥 생성자뿐만 아니라 모든 것 같습니다 메소드들, 그래서 나는 그것들을 모두 인라인으로 표시 할 것인가? – gardian06

+0

@ gardian06 : 헤더 파일의 메소드를 선언하고 * 정의 *를'cpp' 파일에 넣을 수 없습니까? 이것이 가장 논리적 인 방법입니다. –

+0

이것이 전부입니다. 헤더의 클래스, 멤버 및 스텁을 옮기고 해결 연산자를 컨벤션으로 퍼팅하여 구현했습니다. – gardian06

0

질문에 정보가 주어지면이 메서드는 헤더 파일에 정의되어 있지만 인라인으로 표시되지는 않을 것입니다. 그러면 중복 된 심볼 링커 오류가 발생합니다. hte 메소드를 인라인으로 표시하거나 정의를 소스 (.C) 파일로 이동하십시오.

+0

그 생성자뿐만 아니라 모든 메소드처럼 보이기 때문에 모든 인라인을 표시합니다. – gardian06

관련 문제