关于项目组织的建议

时间:2014-06-18 10:43:11

标签: qt qt-creator qmake project-organization project-structure

关于如何为满足我的需求制定最佳组织项目,我有几个问题。

上下文

我正在研究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-file中,我都包含了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,但尝试链接所有对象,并且我有未定义的对main的引用...)

提前致谢。

1 个答案:

答案 0 :(得分:2)

我认为尽可能将代码模块彼此分离是一个好主意。这样,您就可以拥有可重复使用且可以轻松更改的独立软件模块。

我个人使用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