Почему это простое приложение Qt не содержит ссылок - PullRequest
6 голосов
/ 23 ноября 2011

Я пытался написать простое приложение на 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 "
    (? Метаобъект @ 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)».

Я думаю, что они как-то связаны с MetaObjectCompiler из Qt, но я не могу найти решение. Я знаю, что не считается хорошим стилем программирования в C ++ помещать объявления и определения в один файл, но здесь дело не в этом. По моему мнению, это должно быть возможно, так как здесь нет ничего синтаксически неправильного.

Ответы [ 4 ]

12 голосов
/ 23 ноября 2011

Используйте приведенный ниже код и обязательно выполните 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 и т. Д.

3 голосов
/ 23 ноября 2011

Я думаю, вам нужно скопировать файл и включить полученный main.moc внизу.

0 голосов
/ 12 мая 2017

Я только что столкнулся с той же проблемой, и она была решена путем изменения набора символов моего заголовка с Unicode на ANSI.

0 голосов
/ 20 сентября 2013

Я думаю, что это как-то связано с QMake.Дело не в том, что исполняемое приложение не может видеть экспортированный класс DLL.Дело в том, что файл obj для класса не существует.Запуск QMake из меню QT Creator Build, а затем сборка, кажется, работает.

Почему это простое приложение Qt не связывает

...