2010-06-02 6 views
6

지금 CSP (제약 조건 만족) 이론 자료를 배우고 있으며 this 라이브러리를 사용하여 XML 파일을 구문 분석하고 있습니다. Xcode를 IDE로 사용하고 있습니다.중복 심볼 링커 오류 (C++ 도움말)

내 프로그램이 잘 컴파일되지만 파일을 링크 할 때 XMLParser_libxml2.hh 파일에 중복 된 심볼 오류가 발생합니다. 내 파일과 같은 구분됩니다


클래스 헤더 파일을 포함하는 클래스 구현 파일 위의 XmlParser가 파일을 포함하는 클래스 헤더 파일
클래스 헤더 파일

중복을 포함하는 기본 파일 심볼은 main.o와 classfile.o에서 발생하지만, 내가 알 수있는 한 실제로 .hh 파일을 두 번 추가하지는 않습니다.

전체 오류 :

ld: duplicate symbol bool CSPXMLParser::UTF8String::to<std::basic_string<char, 
std::char_traits<char>, std::allocator<char> > >(std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >&) constin 
/Users/vash265/CSP/Untitled/build/Untitled.build/Debug/Untitled.build/Objects- 
normal/x86_64/dStructFill.o and 
/Users/vash265/CSP/Untitled/build/Untitled.build/Debug/Untitled.build/Objects- 
normal/x86_64/main.o` 

주요 파일에 클래스의 구현을 복사하고, 컴파일 대상에서 클래스 구현 파일을 복용 오류를 제거하지만이 방법 비조직적 엉망, 나는 ' 클래스를 곧 추가 할 것입니다 (그리고 파일을 별도의 파일로 가져 오는 것이 좋습니다).

나는 그것을 이해하게되었는데, 이는 하나의 파일에 클래스와 함수 정의 및 구현을 모두 가지고있는 파일 (XMLParser_libxml2.hh)에 의해 발생합니다 (그리고 이것은 그 '헤더'파일에서 템플릿 사용). 내 main.cpp에서 모든 클래스 파일을 고수하는 방법에 대한 아이디어가 있습니까? (나는 시도했습니다 #ifdefs, 그들은 작동하지 않습니다).

+3

머리말에있는 모든 함수 (클래스 정의 또는 함수 템플릿에 정의 된 멤버 함수 제외)가'inline'으로 선언 되었습니까? –

+0

우리는 코드가 어떻게 구조화되어 있는지에 대해 더 자세히 알아야하고 중복 된 심볼 오류를 생성하는 클래스가 작성되었거나 이미 존재하는지 여부를 알아야합니다. 기본적으로 이것은 코드를 두 번 링크하려고한다는 것을 의미합니다. 그러나 이것은 한 번 겪었던 문제처럼 들리지만 이것은 앱을 만드는 방식에 기인합니다. 예를 들어 정적 및 동적 연결을 혼합하여 사용하고있었습니다. 따라서 모든 것을 정적 또는 모든 동적으로 링크해야합니다. 양쪽 모두의 혼합이 복잡하고 그 안에 들어 가지 않았다면 –

+0

@James 링크에서 제공 한 헤더 파일을 참조한다면, 모든 함수가 수업. 코드가 일종의 엉망이기 때문에 말하기가 약간 어렵습니다. 내 자신의 코드가 간다면, 멤버 함수가 아닌 함수는 없다. @Yan 오류를 생성하는 파일은 궁극적으로 나를 만듭니다. 이 오류는 XMLParser 헤더 (필자가 작성하지 않음)를 클래스 파일에 포함 시켰는데, 이는 주요 함수 및 클래스 구현 파일 (필자가 쓴, 오류에 명명 된 파일 임)에 포함되었습니다. – Vash265

답변

3

제임스가 정확했습니다. 헤더 파일 내부의 세 가지 템플릿 함수는 제대로 링크되도록 인라인 선언해야합니다. 감사!