如何使用qmake在C ++中创建分层项目结构

m

在使用MinGW,C ++ 11,Qt 5和qmake的Windows下,我具有以下项目结构:

/my-project
   my-project.pro
   /my-app
      my-app.pro
      main.cpp
   /module-a
      module-a.pro
      modulea.h
      modulea.cpp
   /module-b
      module-b.pro
      moduleb.h
      moduleb.cpp

模块之间的依赖关系应如下所示:

my-app ==> module-a ==> module-b

我要实现的是my-app使用模块a,module-a使用模块b,my-app对模块b一无所知。模块a仅通过其实现引用模块b(#include模块b的位于模块a的.cpp中)。

我尝试通过将模块a和模块b配置为qmake中的静态库来实现此目的。不幸的是,在编译时我收到链接器错误,提示“未定义对ModuleB :: doSmthB()的引用”

我理解此链接问题的原因,我的问题是,是否有可能实现与提议的分层结构相似的功能?

资料来源:

my-project.pro:

TEMPLATE = subdirs
SUBDIRS += module-b
SUBDIRS += module-a
SUBDIRS += my-app
my-app.depends = module-a
module-a.depends = module-b

my-app.pro:

QT += widgets
TARGET = my-app
TEMPLATE = app
CONFIG += c++11
SOURCES += *.cpp
win32 {
    INCLUDEPATH += $$clean_path($$PWD/../module-a)
    DEPENDPATH += $$clean_path($$PWD/../module-a)
    LIBS += $$clean_path($$OUT_PWD/../module-a/debug/libmodule-a.a)
    PRE_TARGETDEPS += $$clean_path($$OUT_PWD/../module-a/debug/libmodule-a.a)
}

main.cpp:

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>

#include "modulea.h"

int main(int argc, char *args[])
{
    QApplication app(argc, args);
    QGraphicsView view;
    QGraphicsScene *scene = new QGraphicsScene(0, 0, 300, 300, &view);
    ModuleA moduleA;
    scene->addText(QString::number(moduleA.doSmthA())); // undefined reference to ModuleB::doSmthB()
    view.setScene(scene);
    view.show();
    return app.exec();
}

module-a.pro:

QT -= core gui
TARGET = module-a
TEMPLATE = lib
CONFIG += staticlib
CONFIG += c++11
HEADERS += *.h
SOURCES += *.cpp
win32 {
    INCLUDEPATH += $$clean_path($$PWD/../module-b)
    DEPENDPATH += $$clean_path($$PWD/../module-b)
    LIBS += $$clean_path($$OUT_PWD/../module-b/debug/libmodule-b.a)
    PRE_TARGETDEPS += $$clean_path($$OUT_PWD/../module-b/debug/libmodule-b.a)
}

modulea.h:

#ifndef MODULEA_H
#define MODULEA_H

struct ModuleA
{
    int doSmthA();
};

#endif // MODULEA_H

modulea.cpp:

#include "modulea.h"
#include "moduleb.h"

int ModuleA::doSmthA() {
    ModuleB other;
    return other.doSmthB();
}

module-b.pro:

QT -= core gui
TARGET = module-b
TEMPLATE = lib
CONFIG += staticlib
CONFIG += c++11
HEADERS += *.h
SOURCES += *.cpp

moduleb.h:

#ifndef MODULEB_H
#define MODULEB_H

struct ModuleB
{
    int doSmthB();
};

#endif // MODULEB_H

moduleb.cpp:

#include "moduleb.h"

int ModuleB::doSmthB() {
    return 12345;
}
m

要修复我的示例,需要进行以下更改:

1)CONFIG += create_prl将.app文件添加到所有应用程序的直接依赖项中(以我为例module-a)。这样修改所有模块不会有什么坏处。

此处的说明:http : //doc.qt.io/qt-5/qmake-advanced-usage.html#library-dependencies

2)在主.pro(在我的示例中为)中,必须将my-project.proapp(SUBDIRS += my-app的子目录声明放在app的直接依赖项之后(SUBDIRS += module-a)。

我在这里找到的第二点的提示:https : //stackoverflow.com/a/1417859/6223445

3)LIBS必须使用-L-l选项(至少在Windows下)定义属性,例如,代替:

LIBS += $$clean_path($$OUT_PWD/../module-a/debug/libmodule-a.a)

使用以下内容:

LIBS += -L$$clean_path($$OUT_PWD/../module-a/debug/) -lmodule-a

固定解决方案如下所示(仅限修改后的文件):

my-project.pro:

TEMPLATE = subdirs
SUBDIRS += module-b
SUBDIRS += module-a
SUBDIRS += my-app
my-app.depends = module-a
module-a.depends = module-b

my-app.pro:

QT += widgets
TARGET = my-app
TEMPLATE = app
CONFIG += c++11
SOURCES += *.cpp
win32 {
    INCLUDEPATH += $$clean_path($$PWD/../module-a)
    DEPENDPATH += $$clean_path($$PWD/../module-a)
    LIBS += -L$$clean_path($$OUT_PWD/../module-a/debug/) -lmodule-a
    PRE_TARGETDEPS += $$clean_path($$OUT_PWD/../module-a/debug/libmodule-a.a)
}

module-a.pro:

QT -= core gui
TARGET = module-a
TEMPLATE = lib
CONFIG += staticlib
CONFIG += c++11
CONFIG += create_prl
HEADERS += *.h
SOURCES += *.cpp
win32 {
    INCLUDEPATH += $$clean_path($$PWD/../module-b)
    DEPENDPATH += $$clean_path($$PWD/../module-b)
    LIBS += -L$$clean_path($$OUT_PWD/../module-b/debug/) -lmodule-b
    PRE_TARGETDEPS += $$clean_path($$OUT_PWD/../module-b/debug/libmodule-b.a)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

构建qmake项目时如何使用C ++ 14功能?

如何使用qmake在C ++中构建独立的共享库?

如何在Azure Key Vault中创建分层数据结构

如何从熊猫中的行创建分层json?

是否可以使用sbt创建分层的多项目构建?

如何在BigQuery中显示多个分层树结构

如何在Java中存储分层结构数据?

如何在Delphi中强制分层源代码结构

使用C#中的闭包创建分层数据?

如何使用命令行qmake创建Qt GUI或QML / Qt快速项目?

如何为每个循环php使用创建分层结构的文件夹?

如何在asp.net中使用LINQ to XML为特定角色创建分层菜单结构?

qMake:如何为C ++中的宏用法定义变量

如何循环结构中的项目?

如何在Eclipse中自动为App Engine项目创建EAR目录结构?

如何从分层分组的数据框中创建构面图

如何在 django 应用程序中创建分层 url?

如何在python中从多个图像创建psd分层文件

如何在iPad App中创建非分层导航

如何在 FLASK 中创建分层的 json 响应

如何检查您是否处于交互式qmake会话中?我想使用qmake提示()

如何在C中创建矩阵结构?

如何创建可以更新(删除/创建/更新)O(1)中的项目并保持线程安全的数据结构?

在C ++中创建“通用”结构

使用结构构造函数在 C++ 中创建结构实例

在 Clojure 中,如何从文本文件中读取分层数据结构?

如何在Eclipse包浏览器中查看分层包的结构

如何在 mongodb 中制作分层结构化数据库?

如何从PySpark中的向量结构获取项目