关于项目组织的建议

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 文件的名称应与其文件夹名称相同。这样子项目就会被检测到并列在“项目”窗格中。

ControllerView 这样的子项目可以是库。 Controller 的 .pro 文件的一部分:

TARGET = Controller
TEMPLATE = lib

DEFINES += Controller_LIBRARY

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

mainApp 和 test 等子项目应该是appmainApp 的 .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第六版/新考纲纯干货!商业论证/效益管理计划/项目运行环境/组织过程资产/环境事业因素/组织系统,系列笔记建议收藏!

关于项目敏捷性的组织考虑因素

python 项目目录结构

关于组织管理和项目管理的一些见解

建议收藏:不容错过的 Node.js 项目架构