Советы по организации проекта


У меня есть несколько вопросов о том, что делать, чтобы иметь лучший проект организации для моих нужд.

Контекст

Я работаю над 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
            ...

Компиляция

На данный момент все работает нормально, за исключением того, что чем больше растет мой проект, тем больше времени на компиляцию. (Около 2 минут).

Я проверил, что произошло, и проблема в том, что в каждый файл test-sub-project Я включаю 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
            ...

Component1 и Component10 были скомпилированы дважды.

Чего бы я хотел

Очевидно, что я хочу генерировать объекты для каждого файла один раз. В идеале, что-то вроде:

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

То, что я не умею делать

1-главная проблема в том, что я не знаю, как сказать QMake я хочу связать ob / src / Controller / Component1.o с obj / test / Controller / main.o

2-согласно вашему опыту, является ли организация, подобная этой, хорошей вещью или слишком сложной, слишком сильно разделенной, ... ?

3-с помощью инструмента qmake я увидел, что вы можете определить target = app или target = lib для создания исполняемого файла или библиотеки. Есть ли ключевое слово, чтобы только генерировать объект без выполнения связывания ? (Я могу сделать это, сняв главный.cpp в ключевых словах источников, но сделать пытается свяжите все объекты, и у меня есть неопределенная ссылка на main...)

Заранее благодарю.

1 2

1 ответ:

Я думаю, что разделение модулей кода друг от друга, насколько это возможно, является хорошей идеей. Таким образом, вы можете иметь независимые программные модули, которые могут быть использованы повторно и легко изменены.

Я лично использую Субдиры для разделения частей моего кода. С его помощью проект становится намного чище и проще для чтения. Qt Creator также обеспечивает хорошую автоматизацию в симпатии частей друг к другу.

Вы можете создать проект Subdirs и добавить подпроекты в его файл. pro :

TEMPLATE = subdirs

CONFIG += ordered

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

Вы должны поставить подпроекты, от которых зависят другие, на первое место в списке. Также обратите внимание, что имя файла. pro подпроекта должно совпадать с именем папки. Таким образом, подпроекты будут обнаружены и перечислены в области проектов.

Такие подпроекты, как Controller и View, могут быть библиотеками. Часть файла. pro для Controller:

TARGET = Controller
TEMPLATE = lib

DEFINES += Controller_LIBRARY

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

Подпроекты, такие как mainApp и test, должны быть app. Часть файла. pro для mainApp:

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