qt - 关于项目组织的建议

标签 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分钟)。

我检查了发生的情况,问题是,在每个测试子项目文件中,我都包含 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 没有定义的引用...)

提前致谢。

最佳答案

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

我个人使用子目录来分隔我的代码部分。使用它,项目变得更加清晰且更易于阅读。 Qt Creator 还提供了良好的自动化功能,可以让各部分相互喜欢。

您可以创建一个 Subdirs 项目并将子项目添加到其 .pro 文件中:

TEMPLATE = subdirs

CONFIG += ordered

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

您应该将其他人依赖的子项目放在列表的第一位。另请注意,子项目的 .pro 文件的名称应与其文件夹名称相同。这样子项目就会被检测到并列在“项目” Pane 中。

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

关于qt - 关于项目组织的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24283489/

相关文章:

linux - debug_and_release 选项不适用于 linux

xcode - 如何使用 qmake 和 QT 生成 xcode 项目

c++ - 我的 qmake 构建在调试构建中的速度是 cmake 的两倍多,为什么?

c++ - 动态更改 QLabel 的字体大小以适应可用空间

qt - 在 QTableWidget 中分别处理单击和双击

C++ Qt 框架 : qmake exits with error code 2, 找不到 project.pro 文件,但它在那里

c++ - Qt Creator 中的智能代码补全

qt - 无法在 Qt 项目中使用共享库

c++ - 如何动态交换 QWidgets

c++ - CMake 链接时出错