2009-12-28 3 views
2

gcc 4 및 cmake를 사용하여 GNU/Linux 용 응용 프로그램을 개발하고있어 컴파일 프로세스를 관리하고 있습니다.Visual C++ 2008 Express - cpp 파일 충돌

. 
|-- gfx 
| |-- Object.cpp 
| `-- Object.h 
`-- logic 
    |-- Object.cpp 
    `-- Object.h 

첫 번째 개체 클래스는 GFX 네임 스페이스에 있고 두 번째 논리 네임 스페이스 : 그 이름이 같은 그러나이 같은 다른 디렉토리와 네임 스페이스에 두 개의 파일이있을 때 아무런 문제가없는 것입니다 발견했다.

그런 다음 Visual C++ 2008 Express Edition을 사용하여이 프로젝트를 컴파일하려고했습니다. 링커는 존재하지 않는 Gfx :: Object 클래스 구현에 대해 몇 가지 오류를 던졌습니다.

  • 비주얼 C++가 Object.cpp 파일의 두
  • 변화가 첫 번째 또는 두 번째 파일에 발생하면 개체 단위의 재 컴파일이 대기
  • 그것은 항상 단지를 재 컴파일 추적 : 몇 가지 검사 후에 나는 것을 발견 어떤 파일이 실제로 수정되었는지에 관계없이 두 번째 Object.cpp

나는 또한 Visual C++에서 동일한 이름의 두 클래스를 만들 수 없다는 것을 알게되었습니다.

해결 방법은 있습니까? 나는 코드의 꽤 큰 부분을 리팩터링하고 싶지는 않다.

+2

동일한 범위에있는 동일한 이름의 두 클래스는 어떤 경우에도 잘못되었습니다. 별도의 네임 스페이스에 있거나 컴파일 단위를 구분하기 위해 로컬 화되어야합니다. 컴파일러, 링커 또는 IDE가 이에 대해 불평하고 있습니까? 당신은 아마도 당신이 가진 동일한 진단 정보를 볼 수 있도록이 빌드 로그를 추가해야 할 것입니다. – Clifford

+1

그는 구체적으로 그가 다른 네임 스페이스에 있다고 말합니다. 그렇지 않습니다. –

+0

@ Clifford, Pavel 예, 클래스는 별도의 네임 스페이스에 있으므로이 경우는 유효해야합니다. 이것은 IDE가이 상황과 혼동을 일으키고 하나의 Object.cpp를 다른 것으로 구분할 수없는 것처럼 보입니다. –

답변

7

두 Object.cpp 파일은 모두 Object.obj로 컴파일됩니다. 같은 디렉토리에. 즉, 마지막으로 컴파일 된 것은 첫 번째 Object.obj를 덮어 씁니다. 예, 링커가 그것에 의해 흥분하지 않을 것이고, 동일한 Object.obj 파일을 두 번 링크하기 때문에 당신은 곱셈 기호를 얻을 것입니다.

수정 프로그램은 쉽게 Object.cpp 파일, 속성, C/C++, 출력 파일 중 하나를 마우스 오른쪽 단추로 클릭하십시오. 개체 파일 이름을 $ (IntDir) \에서 $ (IntDir) \ $ (InputName)로 변경하십시오. 2.obj

+0

그건 내 작은 문제를 해결, 감사합니다! 그러나 나는 겹쳐 쓰기가 없다는 것을 당신과 논해야 만합니다. 컴파일러가 하나의 파일을 무시했습니다. 나는 cpp 파일에 파일을 추가하는 것으로 확인해 봤다. 출력 파일을 변경했을 때만 실제로 오류가 발생했습니다. –

+0

이제 CMake 명령이 있습니까? – dvide

+0

모르겠지만 어쩌면 cmake를 사용하여 Visual C++ 프로젝트를 준비해야합니까? Visual C++에서 기존 소스의 새 프로젝트를 작성하면 Windows 용 CMakeFiles를 수정하는 것보다 훨씬 쉽습니다. –

2

기본적으로 VC++ 2008은 모든 개체 파일을 단일 출력 폴더에 저장하므로 첫 번째 object.obj 파일의 존재가 두 번째 파일의 종속성을 충족하므로 컴파일되지 않습니다. 그리고 그것이 있었다면, 첫 번째 것을 덮어 씁니다.

중간 디렉터리 설정을 컴파일 할 파일에 의존하도록 할 수 있어야합니다. 그러나 $ (InputDir) 및 다양한 다른 조합으로 설정을 시도했지만 가능할 수도 있지만 작동하는 구성을 성공적으로 수행 할 수 없습니다. 사용 가능한 매크로는 here에 설명되어 있습니다.

"makefile"프로젝트를 사용하지 못하고 make, nmake 또는 cmake 등으로 빌드를 관리하지 못하는 경우 (잘못 알고 있다고하더라도) 근본적으로 잘못된 것은 없으므로 그것은 IDE에서 쉽게 지원되지 않는다는 것입니다.

+0

이 $ (InputDir) 매크로는 다소 이상하게 작동합니다. .obj 파일을 소스 디렉토리 (무작위가 아닌 하나의 이유는 말할 수 없다)에 넣고 일부 objs가 누락되었습니다. 링커는 obj 파일이 올바른 위치에있을 것으로 예상합니다. 오, 내 ... –

1

이것은 이미 답변되었지만 Visual Studio 2010을 자동으로 추가합니다. 두 개의 .obj 파일이 베타 2에서의 경험을 바탕으로 충돌이있는 경우 다른 디렉토리에 저장됩니다.

EDIT : 어, 이건 잘못되었습니다! 진짜 대답은 CMake가 나를 위해 자동으로이 작업을 수행했다는 것입니다.

+0

제대로 작동하도록 적절한 전역 매크로를 설정할 수 없기 때문에 아마도 시도 할 것입니다. 감사! –

+0

흠, 정말 미안하지만 이것은 실제로 잘못되었습니다! 빠른 테스트 후 작동하지 않았습니다. 나는 나를 위해 자동으로 이렇게하고있는 CMake라는 것을 알아 냈다. 그것은 멋지다! 그러나 그것은 당신이 말한 것처럼 당신이 CMake를 사용한다면 왜 내가 처음에이 문제를 가지고 있는지 궁금하게 생각합니까? 어쩌면 CMake를 최신 2.8.0으로 업데이트하려고합니까? – dvide

+0

예,하지만 프로젝트가 아직 Windows 플랫폼에서 작동하도록 구성되어 있지 않습니다. 그렇게 말하면 아마도 조금 더 시도하고 cmake 생성기를 사용해야합니다. :-) –

0

허용 된 솔루션은 확장되지 않았기 때문에 최적이 아닙니다.

비주얼 스튜디오 2010 년, 나는 드라이브 V에 놓여 OBJ 파일이 다음 프로젝트를 가정 소스에 끝낼 수 있도록

V:\%(Directory)$(PlatformName)_$(ConfigurationName)_%(Filename).obj 

Properties -> C/C++ -> Output Files -> Output File Name 

을 설정 (아무 생각이없는 여부 매크로, 아직).

적어도 하나는 아니지만, 적어도 손톱 염 염의 위험없이 많은 소스 파일의 하위 시스템을 쉽게 포크 할 수 있습니다.

By $(InputDir)은 솔루션/프로젝트 디렉토리를 참조하며 다른 디렉토리에서 같은 문제가 발생합니다.

관련 문제