2012-06-11 4 views
2

큰 C++ 프로젝트에서 작업하고 다른 사람의 코드를 변경하고 있습니다. 이 과정에서 참조 번호 VarA이 여러 개 정의되었다는 링커 오류가 발생했습니다. 해당 변수를 찾았고 프로젝트에 직접 포함 된 cpp 파일에 정의되어있었습니다. 원본 파일을 헤더 파일과 소스 파일로 변환하려고 시도했지만 작동하지 않습니다. 이상한 연결 오류

는 I은 단지 다음 모양이 변수를 포함하는 새로운 별도의 H/CPP에 변수 선언을 이동하려고 같은

H 파일 (aaa.h)

#ifndef AAA_H 
#define AAA_H 

#include "classAdefinition.h" 
extern ClassA VarA; 

#endif 

CPP 파일

#include "aaa.h" 
ClassA VarA; 

지금은 주 파일에 aaa.h을 포함하는 경우, 링커 오류가 오류 메시지에 대한 새로운 생성 aaa.obj을 추가 (aaa.cpp) (예 : VarA도 거기에 정의되어 있습니다.) 이것은 내가 기대했던 것입니다. 하지만 기본 파일에서 VarA의 정의를 제거하면 링커 오류가 발생하여 VarA이 정의되지 않아 혼란 스럽습니다.

누군가이 행동의 원인이 될 수있는 단서가 있습니까?

VS2008을 사용 중이며 프로젝트는 cmake으로 생성됩니다. 이것이 문제의 원인일까요? 예 : 구성 문제가있을 수 있습니까? 우리는 또한 템플릿을 자주 사용합니다. 문제가 생길 수 있습니까?

+0

"메인 파일에서'VarA'의 정의를 지울 때'aaa.cpp'를 여전히 나머지 파일에 링크하고 있습니까? – Shahbaz

+0

나는 그렇게 생각한다. 그러나 나는 절대적으로 확신하지 못한다. 앞서 언급했듯이 우리는 cmake를 사용하여 프로그램을 작성합니다. 하지만 VarA를 제거 할 때 cmake 구성을 변경하지 마십시오 –

답변

0

을 제공합니다.

0

여러 순환 호출로 인해 발생하는 여러 정의 된 오류를 제거하려면 먼저 다음 매크로를 포함하도록 헤더 파일을 편집해야합니다 (모든 경우에 해당 될 수 있음) 나는 오류를 발견하지 않은,하지만 타사 대부분의 코드가 변경 되었기 때문에 문제는 이제 피할 수 및 오류가 더 이상 발생 시킬수하지 않는 각 파일에 고유 한 이름

#ifndef CAR_HPP 
#define CAR_HPP 
class Car 
    { 
    public: 
    .... 
    protected: 
    .... 
    }; 
#endif 
+0

파일에 포함 가드가 있습니다. 죄송합니다. 위의 코드에 추가하는 것을 잊어 버렸습니다. –