关于如何为满足我的需求制定最佳组织项目,我有几个问题。
上下文
我正在研究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的引用...)
提前致谢。
答案 0 :(得分:2)
我认为尽可能将代码模块彼此分离是一个好主意。这样,您就可以拥有可重复使用且可以轻松更改的独立软件模块。
我个人使用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