Ошибка ссылки при компиляции примера qt в visual studio - PullRequest
1 голос
/ 03 января 2012

У меня проблема с компиляцией примера qt из программирования на языке c ++ с использованием qt 4 второе издание книга по Visual C ++ Express 2010. Так как надстройка для Visual Studio не работает с Express Edition, янастроил его сам, просто добавив зависимости библиотеки: qtmaind.lib QtCored4.lib QtGuid4.lib. Также я могу скомпилировать пример кода «Hello, Qt!»без ошибок.Мой проект содержит два файла .cpp и заголовочный файл:
findDialog.h:

#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QtGui\qdialog.h>
class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class findDialog : public QDialog
{
    Q_OBJECT
public:
    findDialog(QWidget* parent = 0);
signals:
    void findNext(const QString &str , Qt::CaseSensitivity cs);
    void findPrevious(const QString &str , Qt::CaseSensitivity cs);
private slots:
    void findClicked();
    void enableFindButton(const QString& text);
private:
    QLabel* label;
    QLineEdit* lineEdit;
    QCheckBox* caseCheckBox;
    QCheckBox* backwardCheckBox;
    QPushButton* findButton;
    QPushButton* closeButton;
};
#endif

findDialog.cpp:

#include <QtGui\QtGui>
#include "findDialog.h"


findDialog::findDialog(QWidget* parent) : QDialog(parent)
{
    label = new QLabel(tr("Find &what:"));
    lineEdit = new QLineEdit;
    label->setBuddy(lineEdit);

    caseCheckBox = new QCheckBox(tr("Match &case"));
    backwardCheckBox = new QCheckBox(tr("Search &backward"));

    findButton = new QPushButton(tr("&Find"));
    findButton->setDefault(true);
    findButton->setEnabled(false);

    closeButton = new QPushButton(tr("Close"));

    connect(lineEdit , SIGNAL(textChanged(const QString&)) , this , SLOT(enableFindButton(const QString&)));
    connect(findButton , SIGNAL(clicked()) , this , SLOT(findClicked()));
    connect(closeButton , SIGNAL(clicked()) , this , SLOT(close()));

    QHBoxLayout* topLeftLayout = new QHBoxLayout;
    topLeftLayout->addWidget(label);
    topLeftLayout->addWidget(lineEdit);

    QVBoxLayout *leftLayout = new QVBoxLayout;
    leftLayout->addLayout(topLeftLayout);
    leftLayout->addWidget(caseCheckBox);
    leftLayout->addWidget(backwardCheckBox);

    QVBoxLayout *rightLayout = new QVBoxLayout;
    rightLayout->addWidget(findButton);
    rightLayout->addWidget(closeButton);
    rightLayout->addStretch();

    QHBoxLayout *mainLayout = new QHBoxLayout;
    mainLayout->addLayout(leftLayout);
    mainLayout->addLayout(rightLayout);
    setLayout(mainLayout);

    setWindowTitle(tr("Find"));
    setFixedHeight(sizeHint().height());
}

void findDialog::findClicked()
{
    QString text = lineEdit->text();
    Qt::CaseSensitivity cs = caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;

    if(backwardCheckBox->isChecked())
        emit findPrevious(text , cs);
    else
        emit findNext(text , cs);
}

void findDialog::enableFindButton(const QString& text)
{
    findButton->setEnabled(!text.isEmpty());
}

main.cpp:

#include <QtGui\qapplication.h>
#include <iostream>
#include "findDialog.h"



int main(int argc , char* argv[])
{
    QApplication app(argc , argv);
    findDialog* dialog = new findDialog;
    dialog->show();
    return app.exec();
}

Когда я компилирую этот проект, я получаю 6 ошибок ссылок:

LNK2001: неразрешенный внешний символ "public: virtual struct QMetaObject const * __thiscall findDialog :: metaObject (void) const" (? MetaObject @ findDialog)@@ UBEPBUQMetaObject @@ XZ)

LNK2001: неразрешенный внешний символ "public: virtual void * __thiscall findDialog :: qt_metacast (char const *)" (? Qt_metacast @ findDialog @@ UAEPAXPBD @ Z) * ​​10171018 * LNK2001: неразрешенный внешний символ "public: virtual int __thiscall findDialog :: qt_metacall (enum QMetaObject :: Call, int, void * *)" (? Qt_metacall @ findDialog @@ UAEHW4Call @ QMetaObject @@ HPAPAX @)

LNK2001: неразрешенный внешний символ "public: static struct QMetaObject const findDialog :: staticMetaObject" (? StaticMetaObject @ findDialog @@ 2UQMetaObject @@ B)

LNK2019: неразрешенный внешний символ "protected: void__hiscall findDialog :: findNext (класс QString const &, enum Qt :: CaseSensitivity) "(? findNext @ findDialog @@ IAEXABVQString @@ W4CaseSensitivity @ Qt @@@ Z), на который ссылается функция" private: void __thiscall findDialog :: findClicked (void) "(? findClicked @ findDialog @@ AAEXXZ)

LNK2019: неразрешенный внешний символ" protected: void __thiscall findDialog :: findPrevious (класс QString const &, enum Qt :: CaseSensitivity) "(? findPrevious @ findDialog @)@ IAEXABVQString @@ W4CaseSensitivity @ Qt @@@ Z), на которую ссылается функция "private: void __thiscall findDialog :: findClicked (void)" (? FindClicked @ findDialog @@ AAEXXZ)

Заранее спасибо и извините замой плохой английский.

Ответы [ 4 ]

1 голос
/ 03 января 2012

Возможно, вы сможете решить свою проблему с помощью большой работы, основываясь на диагнозе Kia.celever и дополнительной информации от

  1. претензия на успех
  2. один источник (1) основан на
  3. довольно типичное сообщение на форуме QT (резюме: ожидайте проблем)

Но все это работаетне продвинет ваши знания / навыки в программировании вообще, c ++ или qt.Если для вас важна Visual Studio, инвестируйте в неограниченную версию для профессионального использования и установите надстройку, чтобы избежать проблем с настройкой инструмента для использования, для которого он не предназначен.В противном случае установите QT-Creator (см. (2); Qt Creator IDE и инструменты ).

1 голос
/ 04 января 2012

Поскольку у вас нет Qt Integration, я проверил один из моих проектов Qt для настроек.

На странице property в FindDialog.h измените Item Type с C/C++ header на Custom Build Tool. При нажатии Apply новый элемент Custom Build Tool появится слева. Разверните его, в General вы найдете Command Line, введите

"$(QTDIR)\bin\moc.exe"   -DUNICODE -DWIN32 -DQT_THREAD_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_DLL  "-I.\GeneratedFiles" "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" ".\FindDialog.h" -o ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp"

Это моя командная строка для сборки релиза. Вы должны изменить его в соответствии с вашей конфигурацией. Не забудьте добавить сгенерированный cpp в ваш проект.

Под Custom Build Tool есть элемент под названием Outputs, который должен быть

".\GeneratedFiles\$(ConfigurationName)\moc_FindDialog.cpp" 

Поскольку я все еще что-то упускаю, следующий раздел для этого файла в файле проекта vc:

        <File
            RelativePath=".\FindDialog.h"
            >
            <FileConfiguration
                Name="Release|Win32"
                >
                <Tool
                    Name="VCCustomBuildTool"
                    Description="Moc&apos;ing FindDialog.h..."
                    CommandLine="&quot;$(QTDIR)\bin\moc.exe&quot;   -DUNICODE -DWIN32 -DQT_THREAD_SUPPORT -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_DLL  &quot;-I.\GeneratedFiles&quot; &quot;-I$(QTDIR)\include&quot; &quot;-I.\GeneratedFiles\$(ConfigurationName)\.&quot; &quot;-I.&quot; &quot;-I$(QTDIR)\include\QtCore&quot; &quot;-I$(QTDIR)\include\QtGui&quot; &quot;.\FindDialog.h&quot; -o &quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;&#x0D;&#x0A;"
                    AdditionalDependencies="&quot;$(QTDIR)\bin\moc.exe&quot;;.\FindDialog.h"
                    Outputs="&quot;.\GeneratedFiles\$(ConfigurationName)\moc_FindDialog.cpp&quot;"
                />
            </FileConfiguration>
            <FileConfiguration
                Name="Debug|Win32"
                >
                <Tool
                    Name="VCCustomBuildTool"
                    Description="Moc&apos;ing FindDialog.h..."
                    CommandLine="&quot;$(QTDIR)\bin\moc.exe&quot;   -DUNICODE -DWIN32 -DQT_THREAD_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB  &quot;-I.\GeneratedFiles&quot; &quot;-I$(QTDIR)\include&quot; &quot;-I.\GeneratedFiles\$(ConfigurationName)\.&quot; &quot;-I.&quot; &quot;-I$(QTDIR)\include\QtCore&quot; &quot;-I$(QTDIR)\include\QtGui&quot; &quot;.\FindDialog.h&quot; -o &quot;.\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp&quot;&#x0D;&#x0A;"
                    AdditionalDependencies="&quot;$(QTDIR)\bin\moc.exe&quot;;.\FindDialog.h"
                    Outputs="&quot;.\GeneratedFiles\$(ConfigurationName)\moc_FindDialog.cpp&quot;"
                />
            </FileConfiguration>
        </File>

Обратите внимание, что это от vcproj для VS2008.

1 голос
/ 03 января 2012

Ошибки в ссылках исходят от Qt's Meta Object Compiler.Просто, когда вы пишете макрос Q_OBJECT в классе, он определяет некоторые функции-члены в классе, которые необходимы Qt для обработки событий ....Qt MOC создаст новый файл .cpp и запишет в него тело этих функций.Ошибки ссылок ясно показывают, что конкретный файл .cpp для FindDilog (с именем moc_FindDialog.cpp) отсутствует.Это означает, что файл moc не генерируется Qt.Возможно, Visual Studio забыла вызвать Qt Moc для генерации файла .cpp.и, возможно, компилятор Visual Studio не компилирует его ...

0 голосов
/ 10 февраля 2018

Убедитесь, что findDialog.h явно включен в ваш файл .pro.Если это не так, добавьте его и убедитесь, что снова запустили qmake, прежде чем пытаться построить свой проект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...