2009-07-07 2 views
1

매우 큰 프로젝트를 빌드하는 데 MSVC++ 6을 사용하고 있습니다. 이 프로젝트의 소스 파일 중 일부는 우리가 응용 프로그램을 유지 관리하는 데 사용하는 작은 유틸리티와 공유됩니다. 이전에는이 ​​작은 유틸리티가 기본 응용 프로그램의 여러 libs에 연결되어야하고 런타임에 기본 응용 프로그램의 DLL도 필요했습니다. 이러한 종속성을 제거하는 임무를 맡았는데, 매우 간단하게 들렸습니다 ... 불행히도 기본 응용 프로그램에 사용되는 미리 컴파일 된 헤더로 인해 많은 문제가 발생했습니다.미리 컴파일 된 헤더를 사용하는 프로젝트에서 일부 파일의 종속성을 재구성하면 링커 오류가 발생합니다.

필자는 먼저 유틸리티의 모든 파일을 명시 적으로 수정하여 필요한 모든 것을 명시한 다음 PCH (유틸리티에 대한 불필요한 종속성의 95 %가 제거 된)에 대한 #include 지시문을 제거했습니다. 이 유틸리티를 컴파일하는 데 좋습니다. 그러나 이제는 주 앱을 컴파일하면 미리 컴파일 된 헤더 지시문이 누락되었다는 오류가 발생합니다. 나는 위대하다고 생각했다. 조건부로 PCH를 포함 할 것이다. 이것은 작동하지 않는 것 같아요 ... 난 "예기치 않은 #endif", here 언급 한 얻을. 내 다음 생각은 유틸리티와 기본 앱간에 공유되는 세 개의 소스 파일에 대한 주 앱에서 PCH를 사용 중지하는 것이 었습니다. 이 성공적으로 컴파일하지만 나는 연결하는 동안 다음과 같이 오류의 무리를 얻을 :

tls7d.lib(tls707d.dll) : error LNK2005: "public: unsigned int __thiscall RWCString::length(void)const " ([email protected]@@QBEIXZ) already defined in stripledescypher.obj 

AFAICT, 곱하기 정의 기호 모두 내가 명시 적으로 PCH의 필요성을 피하기 위해 공유 파일에 포함 것들을 . 내 직감은 그 3 개의 파일을 PCH .cpp 파일과 동일한 DLL에 연결하기 때문에 여러 위치에서 컴파일된다는 것입니다. 이 혼란에서 벗어날 방법이 있습니까? 나는 무엇이든 시도해 볼 것입니다 ...

답변

1

컴파일 단위를 처리 할 때 컴파일러가 기호 X의 정의를 찾으면 링커에 대한 힌트를 만듭니다. X가 여기에 있습니다!

정의 (예 : 단순한 선언이 아님) 두 개의 소스 파일을 모두 컴파일하면 동일한 심볼을 정의하는 두 개의 오브젝트 파일이 생성됩니다. 링커는 심볼이 여러 번 정의 된 것을 찾습니다.

따라서 stripledescypher 오브젝트 파일에는 WCString::lenght()const 메소드 정의가 포함되어있는 것으로 보입니다. 이것은 클래스의 헤더 나 그와 비슷한 것으로 정의 된 함수 본문 때문일 수 있습니다.

관련 문제