关于项目组织的建议
Posted
技术标签:
【中文标题】关于项目组织的建议【英文标题】:Advices about project organisation 【发布时间】:2014-06-18 10:43:10 【问题描述】:我有几个关于如何做才能拥有满足我需求的最佳组织项目的问题。
上下文
我正在研究 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 分钟)。
我检查了发生的情况,问题是,在每个测试子项目文件中,我都包含 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 来生成可执行文件或库。是否有关键字只生成对象而不执行链接? (我可以在关键字 SOURCES 中删除 main.cpp 但 make 尝试链接所有对象,并且我对 main 的引用未定义...)
提前致谢。
【问题讨论】:
【参考方案1】:我认为尽可能将代码模块彼此分离是个好主意。这样您就可以拥有独立的软件模块,这些模块可以重复使用并且可以轻松更改。
我个人使用 Subdirs 来分隔我的代码的各个部分。使用它,项目变得更加清晰和易于阅读。 Qt Creator 还提供了很好的自动化来相互喜欢这些部分。
您可以创建一个 Subdirs 项目并将子项目添加到其 .pro 文件中:
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += \
Controller\
View\
Component1\
Component2\
component10\
test\
mainApp
您应该将其他人依赖的子项目放在列表的首位。另请注意,子项目的 .pro 文件的名称应与其文件夹名称相同。这样子项目就会被检测到并列在“项目”窗格中。
像Controller
和View
这样的子项目可以是库。 Controller
的 .pro 文件的一部分:
TARGET = Controller
TEMPLATE = lib
DEFINES += Controller_LIBRARY
SOURCES += ...
HEADERS += ...
mainApp 和 test 等子项目应该是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
【讨论】:
感谢您的完整回答!我有一种感觉,为 Controller 和 View 创建一个库可能是一个解决方案。我没有这样做,因为对我来说,将几乎整个应用程序放在一个库(控制器)中并且只是一个调用库中 mainRoutine 的小型可执行文件有点奇怪。我知道 subdirs 的使用,但阅读您的评论,我发现我根本没有正确使用它! @user3726543 该库不必是动态链接的 (.dll/.so),它可以是静态库 (.lib/.a)。然后,它将成为每个可执行文件的一部分。但是,如果您的可执行文件不是静态链接的,那么使用静态库可能会浪费空间。以上是关于关于项目组织的建议的主要内容,如果未能解决你的问题,请参考以下文章
组织多个 scala 相互关联的 sbt 和 git 项目 - 最佳实践建议
项目管理/PMP/PMBOK第六版/新考纲纯干货!商业论证/效益管理计划/项目运行环境/组织过程资产/环境事业因素/组织系统,系列笔记建议收藏!