对 MasterController::StaticMetaObject 的未定义引用

2024-04-24

我刚刚开始学习 Qt,目前正在阅读这本书学习 Qt 5,作者:Nicolas Sheriff。在我所在的位置,在第 2 章中,我遵循所有说明,并且理解我在做什么,但我陷入了一件事:当我与其他程序一起编译以下程序时,我收到此错误列表:显示错误消息的图像 https://i.stack.imgur.com/zg4Bm.png

这是项目结构 https://i.stack.imgur.com/9eTsD.png

我发现值得展示的文件是:

cm.pro 文件

QT       -= gui

TARGET = cm-lib
TEMPLATE = lib

CONFIG += c++17
DEFINES += CMLIB_LIBRARY
INCLUDEPATH += source

SOURCES += source/models/client.cpp \
           source/controllers/master-controller.cpp \

HEADERS += source/cm-lib_global.h \
           source/controllers/master-controller.h \
           source/models/client.h \

cm-lib.pro

QT       -= gui

TARGET = cm-lib
TEMPLATE = lib
CONFIG += c++17
DEFINES += CMLIB_LIBRARY
INCLUDEPATH += source

SOURCES += source/models/client.cpp \
           source/controllers/master-controller.cpp \

HEADERS += source/cm-lib_global.h \
           source/controllers/master-controller.h \
           source/models/client.h \

cm-ui.pro

QT += qml quick

TEMPLATE = app
CONFIG += c++17
INCLUDEPATH += source \
        ../cm-lib/source

SOURCES += source/main.cpp

RESOURCES += views.qrc
LIBS += -L$$PWD/../../build-cm-kit1-Debug/cm-lib/ -lcm-lib

主控制器.h

#ifndef MASTERCONTROLLER_H
#define MASTERCONTROLLER_H
#include <QObject>
#include <QString>
#include <cm-lib_global.h>

namespace cm::controllers {
class CMLIBSHARED_EXPORT MasterController : public QObject
{
    Q_OBJECT
    QString welcomeMessage = "This is MasterController to Major Tom";
    Q_PROPERTY( QString ui_welcomeMessage MEMBER welcomeMessage CONSTANT )
    public:
    explicit MasterController(QObject* parent = nullptr);
};
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include <controllers/master-controller.h>

int main(int argc, char *argv[])
{
    #if defined(Q_OS_WIN)
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    #endif

    QGuiApplication app(argc, argv);

    qmlRegisterType<cm::controllers::MasterController>("CM", 1, 0, "MasterController");

    cm::controllers::MasterController masterController{};

    QQmlApplicationEngine engine{};
    engine.rootContext()->setContextProperty("masterController", &masterController);
    engine.load(QUrl(QStringLiteral("qrc:/views/MasterView.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

之所以这么长,是因为我在这里像书中一样使用了 MVC 设计模式。

我认为问题是由 Q_OBJECT 宏包含在MasterController.h因为当我删除它时,该项目编译良好,没有任何问题。

在谷歌搜索这个问题之后,在我访问过的几乎所有地方,错误都是由于包含 Q_OBJECT 宏的类将在它们自己的头文件中声明或qmake没有在包括 Q_OBJECT 在内的这些文件上重新运行,但在我的情况下并非如此。

使用的系统工具:

  • Qt创建者
  • Qt 5.11 - 库班图 18.04

未定义的引用很可能是由于缺少 moc 文件造成的。当子类化 qt 对象并使用 Q_OBJECT 宏时,Qt 元对象编译器会创建一个 moc 文件 (moc_master-controller.cpp),其中包含 qobject 相关定义,包括缺少的staticMetaObject。该源文件必须与类定义一起编译。这是使用 qmake 时自动完成的。

根据您提供的代码,您的设置应该可以正常工作。有几点值得尝试:

  • 再次运行 qmake。添加或删除 Q_OBJECT 宏后,必须再次运行 qmake。如果您添加了 Q_OBJECTafter运行 qmake 则 makefile 不包含 master-controller.h 的 moc 命令。
  • 确保该类从库中正确导出,并且其他项目找到该库并正确导入。
  • 如果在之前的构建过程中出现问题,值得尝试进行清理和重建。

我尝试根据您提供的代码重现该问题,但它对我来说编译得很好。如果您想与您的代码交叉引用,我在下面包含了我的代码。

cm-lib.pro

QT       -= gui

TARGET = cm-lib
TEMPLATE = lib
CONFIG += c++17
DEFINES += CMLIB_LIBRARY
INCLUDEPATH += source

SOURCES += master-controller.cpp

HEADERS += cm-lib_global.h \
    master-controller.h

cm-lib_global.h

#pragma once

#include <QtCore/QtGlobal>

#if defined(CMLIB_LIBRARY)
#  define CMLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define CMLIBSHARED_EXPORT Q_DECL_IMPORT
#endif

主控制器.h

#pragma once

#include <QObject>
#include <QString>
#include <cm-lib_global.h>

namespace cm::controllers {
class CMLIBSHARED_EXPORT MasterController : public QObject
{
    Q_OBJECT
    QString welcomeMessage = "This is MasterController to Major Tom";
    Q_PROPERTY( QString ui_welcomeMessage MEMBER welcomeMessage CONSTANT )
    public:
    explicit MasterController(QObject* parent = nullptr);
};
}

主控制器.cpp

#include "master-controller.h"

cm::controllers::MasterController::MasterController(QObject* parent):
    QObject(parent)
{
}

cm-ui.pro

QT += qml quick

TEMPLATE = app
CONFIG += c++17
INCLUDEPATH += ../cm-lib

SOURCES += main.cpp

LIBS += -L"../build-cm-lib-Desktop_Qt_5_12_1_MinGW_64_bit-Debug\debug" -lcm-lib

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include <master-controller.h>

int main(int argc, char *argv[])
{
    #if defined(Q_OS_WIN)
        QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    #endif

    QGuiApplication app(argc, argv);

    qmlRegisterType<cm::controllers::MasterController>("CM", 1, 0, "MasterController");

    cm::controllers::MasterController masterController{};

    QQmlApplicationEngine engine{};
    engine.rootContext()->setContextProperty("masterController", &masterController);
    engine.load(QUrl(QStringLiteral("qrc:/views/MasterView.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 MasterController::StaticMetaObject 的未定义引用 的相关文章

随机推荐

  • 有没有好的 AS3 代码片段/示例的指针?

    我是 AS3 的新手 每天都在学习 我正在寻找好的 AS3 代码片段 示例 小项目 我可以将其用于学习目的和参考 不依赖于 Flash IDE 因为我使用 Flex SDK 和 Flash Develop 此外 我还专门寻找有关音频 视频流
  • jQuery/AJAX - 单击按钮时将内容加载到 div 中?

    有人可以在这里提供帮助吗 我想填充一个div 例如 div div 包含来自外部文件的内容 例如 includes about info html 当单击某个类别的按钮时 例如 p class classloader Click Here
  • 保存实体会导致重复插入到查找数据中

    我使用 EF 4 1 代码优先 来创建我的数据库和对象 Given public class Order public int Id get set public string Name get set public virtual Ord
  • 绕过 InAppBrowser Cordova 插件中的 SSL 错误

    我已在 Cordova 项目中添加了一个 InAppBrowser 插件来访问站点并获取令牌 但是虽然该站点在桌面浏览器中正常打开 但从移动浏览器打开时却出现错误 此外 默认的本机浏览器会在出现 SSL 错误时要求继续 但 Cordova
  • 微软动态 - Web API

    我正在尝试通过 Web API 在 Dynamics 365 实例中创建一个新的 事件 案例 在我的http请求中 我不知道哪个字段是必填的 我尝试仅添加标题 主题和客户 但返回 Http 400 错误 我正在使用 Postman 尝试我的
  • 为什么 console.dir('') 打印“无属性”?

    我的印象是字符串具有属性 例如match 为什么console dir 声称 没有属性 至少在 Google Chrome 中 这是因为 是一个字符串文字 而不是一个实例String 班级 由于属性如match宣布于String proto
  • 双击 Selenium 的 javascript 执行

    有一种方法可以通过执行 javascript 来单击元素 如下所示 JavascriptExecutor driver executeScript arguments 0 click element 我想通过执行 JavaScript 来双
  • 允许在 Google 计算引擎 (GCE) 中使用 WebSocket

    我正在使用计算引擎 GCE 通过 Socket IO Node js 运行我的套接字服务器 它仅适用于轮询 当我尝试使用网络客户端时 我收到以下错误代码 WebSocket connection to ws myapp socket app
  • Swift:Switch 语句失败行为

    目前我有这个 let somePoint 1 0 switch somePoint case 0 0 print origin does not print fallthrough case 0 print y axis prints y
  • 如何将路径图像用户存储到数据库中:Codeigniter

    我正在尝试将不同用户的图片路径上传到数据库中 我对 codeigniter 很陌生 并且阅读了很多教程 但我仍然在挣扎 这是我的控制器 但我什至不知道如何将图像与用户会话链接 这是我的代码 function do upload config
  • 将私有 GitLab 的依赖项与 NPM 结合使用

    我正在尝试从私有 GitLab 实例安装 NPM 依赖项 所以 我有带有基本文件的存储库 我在中添加了这个依赖项package json在我的项目上 node demo package https oauth2
  • 通过ajax请求提交html表单? [复制]

    这个问题在这里已经有答案了 可能的重复 jQuery AJAX 提交表单 https stackoverflow com questions 1960240 jquery ajax submit form 我在页面 A 上有一个表单 而不是
  • 在 Three.js 中渲染具有大量对象的多个场景的最佳方式

    想象一下 您想要绘制两个场景 每个场景都有数百个球体 并提供在这些场景之间切换的功能 做到这一点的最佳方法是什么 目前 一个开关大约需要 4 到 5 秒 因为我要删除 创建和绘制每个开关上的所有球体 下面是在场景切换上运行的代码示例 cle
  • 如何在react redux中实现一个自包含组件?

    我正在基于react redux构建一个文件管理器webui 我的目的是通过这个项目掌握react和redux 如您所知 文件管理器需要一个树浏览器 我想构建一个可以包含它自己并且每个都有自己状态的组件 像下面这样 TreeNode可以包含
  • Chrome 是否已停止支持 Intl 函数?

    我使用的是 Chrome 浏览器 版本 92 0 4515 131 我发现对 JavaScript Intl 的支持不能正常运行Chrome浏览器 const formattedDate new Intl DateTimeFormat nb
  • 如何借助 XSLT 取消转义转义 XML 内容?

    我的问题是如何取消转义已经转义的 xml 我尝试了 Tomalak 提供的代码来响应如何借助 XSLT 转义 XML 字符 https stackoverflow com questions 2463155 how to unescape
  • 让 Git 确认之前移动的文件

    我不假思索地手动移动了一堆文件 并且找不到一种方法让 git 识别这些文件只是被移动 而不是实际上不同的文件 除了删除旧的并添加新的 从而丢失历史记录 或使用 git mv 重做所有更改之外 还有其他方法可以做到这一点吗 要让 git 删除
  • OnPreferenceChange Listener 和 OnSharedPreferenceChangeListener 之间有什么不同

    我想获取复选框首选项的值 哪种方法适合聆听喜好 OnPreferenceChange Listener 和 OnSharedPreferenceChangeListener 之间的真正区别是什么 UPDATE为什么 onSharedPref
  • 即使收到 200,angularjs $http.jsonp 也会转到 .error 而不是 .success

    我正在构建一个 AngularJS 应用程序 它调用一个从数据库获取数据的 NodeJS 服务器 NodeJS 返回 JSON stringify someArrayWithData 这是 AngularJS 代码 scope getMai
  • 对 MasterController::StaticMetaObject 的未定义引用

    我刚刚开始学习 Qt 目前正在阅读这本书学习 Qt 5 作者 Nicolas Sheriff 在我所在的位置 在第 2 章中 我遵循所有说明 并且理解我在做什么 但我陷入了一件事 当我与其他程序一起编译以下程序时 我收到此错误列表 显示错误