[C++] qmake가 모든 object (.o) 파일을 하나의 디렉토리에 저장하는 이유는 무엇입니까?



Answers

CMake 가 너무 복잡 할 수 있다는 두려움에 대해 : 나는 두 빌드 시스템을 모두 사용하는 프로젝트에서 작업 해왔다. qmake 가 시작하는 것이 더 쉽다는 데 동의하지만 CMake 확실히 장점이 있습니다.

  • 그것은 소스 밖의 빌드를 매우 쉽게 만듭니다. 빌드 디렉토리에서 cmake <Path to source> 실행하기 만하면됩니다. 예를 들어 원본이 NFS 공유에 있고 개체 파일을 로컬 파일 시스템에 배치하려는 경우에 유용합니다.

  • 추가 라이브러리 찾기에 대한 지원은 매우 강력합니다. 많은 FindXXX.cmake 파일은 이미 CMake 배포판에 포함되어있어 FIND_PACKAGE(OpenCV REQUIRED) 처럼 OpenCV 와 같은 "무거운"라이브러리를 포함 FIND_PACKAGE(OpenCV REQUIRED) .

  • Qt 대한 Qt 지원도 제공합니다. 사실, Qt 가 GUI 부분에 사용되는 더 큰 소프트웨어 프로젝트에이 도구를 사용합니다. 플랫폼 독립성과 qmake 를 통해 쉽게 추가 할 수없는 여러 라이브러리가 필요했기 때문에 CMake 결정했습니다.

전체적으로, (빌드 시스템이 소프트웨어 개발을 방해하지 않는 한) 당신 이 편한 빌드 시스템 사용하십시오.

Question

두 개의 다른 네임 스페이스에 같은 이름의 두 클래스가있는 Qt 애플리케이션이 있다고 가정 해 보겠습니다.

namespace namespace1
{
    class SomeClass;
}

namespace namespace2
{
    class SomeClass;
}

그리고 그것에 따라 프로젝트 디렉토리 구조가 있습니다 :

-->src/
  -->namespace1/
    -->someclass.cpp
  -->namespace2/
    -->someclass.cpp

qmake를 사용하여 응용 프로그램을 컴파일하면 모든 객체 (.o) 파일이 하나의 디렉토리에 저장되므로 someclass.o 파일이 먼저 생성 된 다음 두 번째 someclass.o 파일로 다시 작성됩니다. 이름 충돌이므로 잘못되었습니다. .

왜 qmake는 소스 파일의 디렉토리 구조를 고려하지 않고 왜 namespace1_someclass.onamespace2_someclass.o 와 같은 것을 만들지 않는가?

예, 클래스를 하나의 디렉토리에 넣고 namespace1_someclass.cppnamespace2_someclass.cpp로 이름을 지정하면 이름 충돌이 발생하지 않지만 Qt Creator의 프로젝트 탐색기에서 소스 파일을 볼 때 불편 함이 거의 없습니다. 프로젝트의 소스 파일이 많아 확장하거나 축소 할 수 있는 디렉토리 구조있는 경우보다 읽기 쉽습니다.

한 가지 더 극단적 인 것은 다음과 같은 디렉토리 구조를 갖는 것입니다.

-->src/
  -->namespace1/
    -->namespace1_someclass.cpp
  -->namespace2/
    -->namespace2_someclass.cpp

이름 충돌을 해결하지만 네임 스페이스 이름을 중복 하여 중복 되므로 이름을 다시 읽을 수 없습니다.

qmake 가 소스 파일에 따라 디렉토리 구조에 오브젝트 파일을 넣을 수있는 옵션 이없는 이유는 무엇입니까? Qt의 제작자가 이것이 중요한 기능이라고 생각하지 않습니까?

그리고 한 가지 더 - qmake 대신 cmake 도구를 사용하도록 권유 할 수는 있지만 qmake 보다 훨씬 어려운 cmake를 사용하고 qmake가 지금까지 저에게 뛰어나다는 것을 알았습니다 - 객체 파일 배치 제외.




Links