Советы по организации проекта
У меня есть несколько вопросов о том, что делать, чтобы иметь лучший проект организации для моих нужд.
Контекст
Я работаю над 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 ответ:
Я думаю, что разделение модулей кода друг от друга, насколько это возможно, является хорошей идеей. Таким образом, вы можете иметь независимые программные модули, которые могут быть использованы повторно и легко изменены.
Я лично использую Субдиры для разделения частей моего кода. С его помощью проект становится намного чище и проще для чтения. 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