2

내 요구에 가장 잘 맞는 조직 프로젝트를 수행하기 위해해야 ​​할 일에 대해 몇 가지 질문이 있습니다.프로젝트 조직에 대한 조언

상황

것은 내가 QT5 작업을하고있어이 같은 프로젝트가 : 순간

MyProject/
    MyProject.pro 
    src/
    src.pro      // target = app (include Controller.pro and View.pro) 
     Controller/
      Controller.pro  // no target, just add some sources 
      Component1/
      Component2/
      ... 
     View/
      View.pro   // no target, just add some sources 
      Component10/
      Component11/
      ... 
     main.cpp 
    test/
     Controller/
      Component1/
       Component1.pro  // target = app 
       main.cpp 
      ... 
     View/
      Component10/
       Component10.pro // target = app 
       main.cpp 
      ... 

컴파일

이 모든 것을 제외하고 잘 작동의 내 프로젝트가 커지면 컴파일 시간도 더 커집니다. (약 2mins).

무슨 일이 있었는지 확인했는데 문제는 각 테스트 하위 프로젝트 파일에 모든 출처를 가지기 위해 Controller.pro가 포함되어 있다는 것입니다.

이렇게하면 소스를 N 번 컴파일하므로 길이가 너무 길어요.

build-MyProject/
    src/
     main.o 
     component1.o 
     component2.o 
     component10.o 
     ... 
    test/
     Controller/
      Component1/
       main.o 
       component1.o 
      ... 
     View/
      Component10/
       main.o 
       component10.o 
      ... 

이 컴포넌트 1과 Component10 두 번 컴파일했다 (생성 된 파일/폴더에서, 내가 좋아하는 뭔가를). 내가 분명히

싶습니다 무엇

, 나는 한 번 각 파일에 대한 객체를 생성합니다. 이상적으로, 뭔가 같은 :

MyProject/
    obj/
     src/
      Controller/
       component1.o 
       component2.o 
      View/
       component10.o 
      main.o 
     test/
      Controller/
       Component1/
        main.o 
      View/
       Component10/
        main.o 

내가 할 방법을 모르는 무엇

1 가장 큰 문제는 내가 산부인과/SRC를 링크 할 qmake를 얘기하는 방법을 모른다이다 /Controller/Component1.o with obj/test/Controller/main.o

2 - 귀하의 경험에 따르면,이 같은 조직, 좋은 점 또는 너무 복잡하거나 너무 많은 분리 된 점 ...?

3- qmake 도구를 사용하면 target = app 또는 target = lib를 정의하여 실행 파일이나 라이브러리를 생성 할 수 있음을 알았습니다. 링크를 수행하지 않고 객체를 생성하는 키워드가 있습니까? (핵심 단어 SOURCES에서 main.cpp을 제거 할 수 있지만 make는 모든 객체를 링크하려고 시도하고 main에 정의되지 않은 참조가 있습니다 ...)

미리 감사드립니다.

답변

2

가능한 한 코드 모듈을 서로 분리하는 것이 좋습니다. 이렇게하면 재사용이 가능하고 쉽게 변경할 수있는 독립적 인 소프트웨어 모듈을 가질 수 있습니다.

개인적으로 내 코드의 부분을 분리하기 위해 하위 디렉토리를 사용합니다. 이 도구를 사용하면 프로젝트를보다 명확하고 쉽게 읽을 수 있습니다. Qt Creator는 또한 파트를 서로 좋아하는 데있어 좋은 자동화 기능을 제공합니다.

당신은 Subdirs '에 프로젝트를하고 그 .PRO 파일에 하위 프로젝트를 추가 할 수 있습니다

TEMPLATE = subdirs 

CONFIG += ordered 

SUBDIRS += \ 
    Controller\ 
    View\ 
    Component1\ 
    Component2\ 
    component10\ 
    test\ 
    mainApp 

가 먼저 목록에서 다른 사람에 의존하는 하위 프로젝트를 데려 와야한다. 또한의 이름에 주목하십시오.하위 프로젝트의 pro 파일은 폴더 이름과 동일해야합니다. 이렇게하면 하위 프로젝트가 감지되어 프로젝트 창에 나열됩니다.

ControllerView과 같은 하위 프로젝트는 라이브러리가 될 수 있습니다. Controller에 대한 .PRO 파일의 일부 :

TARGET = Controller 
TEMPLATE = lib 

DEFINES += Controller_LIBRARY 

SOURCES += ... 
HEADERS += ... 

mainApp 및 테스트처럼 하위 프로젝트는 app해야한다. mainApp에 대한 .PRO 파일의 일부 :

TARGET = mainApp 
TEMPLATE = app 

당신은 하위 프로젝트에 연결하여 각 하위 프로젝트의 라이브러리를 사용할 수 있습니다. 이것은 서브 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "라이브러리 추가"및 "내부 라이브러리"를 선택하여 수행 할 수 있습니다. 하위 프로젝트 목록에서 하나의 라이브러리를 선택하면 링크 구성이 .pro에 자동으로 추가됩니다. 그것은 다음과 같습니다 :

win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../Controller/release/ -lController 
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../Controller/debug/ -lController 
else:unix: LIBS += -L$$OUT_PWD/../Controller/ -lController 

INCLUDEPATH += $$PWD/../Controller 
DEPENDPATH += $$PWD/../Controller 
+0

답장을 보내 주셔서 감사합니다! 저는 Controller와 View 용 라이브러리를 만드는 것이 해결책 일 수 있다고 생각했습니다. 필자가 생각하기에, 하나의 라이브러리 (컨트롤러)에 거의 모든 응용 프로그램이 있고 라이브러리에 mainRoutine을 호출하는 작은 실행 파일이 있기 때문에 조금 이상합니다. 나는 하위 디렉토리의 사용을 알고 있었지만 당신의 코멘트를 읽고, 나는 그것을 올바르게 사용하지 않았다는 것을 알아 냈습니다! – Martin

+0

@ user3726543 라이브러리를 동적으로 링크 할 필요는 없습니다 (.dll/.so). 정적 라이브러리 (.lib/.a)가 될 수 있습니다. 그러면 각 실행 파일의 일부가됩니다. 실행 파일이 정적으로 링크되지 않은 경우 정적 라이브러리를 사용하는 데 공간이 낭비 될 수 있습니다. –