【问题标题】:Why does this Simple Qt Application not link为什么这个简单的 Qt 应用程序没有链接
【发布时间】:2012-01-05 01:16:08
【问题描述】:

我试着写一个像这样的简单 Qt 应用程序:

main.cpp

#include <QApplication>

class MyApp : public QApplication {
        Q_OBJECT
public:
        MyApp(int argc, char* argv[]);
};

MyApp::MyApp(int argc, char* argv[]) :
        QApplication(argc,argv) {
}

int main(int argc, char* argv[]) {
    MyApp app(argc,argv);
    return app.exec();
}

但是当我尝试编译并将其与 Qt Creator 2.3.1 (Qt 4.7.4) 链接时,我收到 3 个“未解析的外部符号”错误:

  • main.obj:-1: 错误: LNK2001:未解析的外部符号
    ""public: virtual struct QMetaObject const * __thiscall MyApp::metaObject(void)const "
    (?metaObject@MyApp@@UBEPBUQMetaObject@@XZ)"。

  • main.obj:-1: 错误: LNK2001:未解析的外部符号
    ""public: virtual void * __thiscall MyApp::qt_metacast(char const*)"
    (?qt_metacast@MyApp@@UAEPAXPBD@Z)"。

  • main.obj:-1: 错误: LNK2001:未解析的外部符号
    ""public: virtual int __thiscall MyApp::qt_metacall(enum QMetaObject::Call,int,void * *)"
    (?qt_metacall@MyApp@@UAEHW4Call@QMetaObject@@HPAPAX@Z)"。

我认为它们在某种程度上与 Qt 的 MetaObjectCompiler 相关,但我无法找到解决方案。 我知道在 C++ 中将声明和定义放在一个文件中并不被认为是好的编程风格,但这不是重点。我认为这应该是可能的,因为这里没有语法错误。

【问题讨论】:

  • 将 'compile' 更改为 'link' 因为这不是编译器问题。

标签: c++ qt qt4 qt-creator moc


【解决方案1】:

我认为您需要 moc 文件并将生成的 main.moc 包含在底部。

【讨论】:

    【解决方案2】:

    使用下面的代码,并确保在构建之前运行qmake (Build > Run qmake)。

    #include <QApplication>
    
    class MyApp : public QApplication {
      Q_OBJECT
    public:
      MyApp(int argc, char* argv[]);
    };
    
    MyApp::MyApp(int argc, char* argv[]) :
      QApplication(argc,argv) {
    }
    
    int main(int argc, char* argv[]) {
      MyApp app(argc,argv);
      return app.exec();
    }
    
    #include "main.moc"
    

    解释:当您包含Q_OBJECT 宏时,这会向 Qt 发出信号,让其执行一系列非标准 C++ 的工作,例如信号和插槽。它通过运行moc 来做到这一点,这在很大程度上是一个代码生成器。运行 qmake 会创建元数据,以便在构建您的项目时,它会知道哪些文件到 moc 等。

    【讨论】:

    • 这很好用。但是当我将声明部分放入单独的头文件时,我仍然不知道为什么不包含 .moc 文件。
    • 您很少需要明确包含任何.moc 文件。 Qt 为您处理这个问题。事实上,我唯一使用过它是在创建像上面那样的示例程序时,你只有一个main.cpp。我认为原因是qmake 自动为您处理扫描头文件,而不是 cpp 文件,因为这些文件通常不包含需要moc-ed 的内容。 doc.qt.nokia.com/latest/moc.html
    【解决方案3】:

    我认为这与 QMake 有关。并不是可执行应用程序看不到导出的 DLL 类。这是该类的obj文件不存在。从 QT Creator Build 菜单运行 QMake,然后构建似乎可以工作。

    Why does this Simple Qt Application not link

    【讨论】:

      【解决方案4】:

      我刚刚遇到了同样的问题,已经通过将我的标头的字符集从 Unicode 更改为 ANSI 来解决。

      【讨论】:

        猜你喜欢
        • 2014-09-26
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 2021-02-05
        • 2020-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多