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


Answers

빌드하려는 것에 따라 qmake에서 subdirs 템플리트를 사용하여 subdirs 할 수 있습니다. 각각의 namespace 디렉토리에 프로젝트 파일을 넣어야하며, 여기에서 객체 파일에 대해 다른 출력 디렉토리를 지정할 수 있습니다.

-->src/main.pro
  -->namespace1/n1.pro
    -->someclass.cpp
  -->namespace2/n2.pro
    -->someclass.cpp

main.pro :

TEMPLATE = subdirs
SUBDIRS  = namespace1 namespace2

n1.pron2.pro :

include("../common.pri")
OBJECTS_DIR = $${PWD}
TARGET = some_target
TEMPLATE = some_qmake_template

common.pri : 두 프로젝트에 공통적 인 구성입니다.

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보다 qmake를 사용하는 것이 훨씬 어렵고 qmake가 지금까지 내게 뛰어나다는 것을 알았습니다 - 객체 파일 배치 제외.