我有几个问题,关于如何才能获得满足我需求的最佳组织项目。
上下文
我正在开发 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 中。
像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
关于qt - 关于项目组织的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24283489/