在visual studio上编译qt示例时发生链接错误
Link error while compiling qt example on visual studio
我在用visual c++express 2010上的qt 4第二版书编译c++GUI编程中的qt示例时遇到了问题。由于qt visual studio加载项不适用于express edition,我只需添加库依赖项就可以自行配置它:qtmaind.lib QtCred4.lib QtGuid4.lib。此外,我还可以编译示例代码"你好,qt!"没有错误。我的项目包含两个.cpp文件和一个头文件:
findDialog.h:
#ifndef FINDDIALOG_H
#define FINDDIALOG_H
#include <QtGuiqdialog.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 <QtGuiQtGui>
#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 <QtGuiqapplication.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)
LNK2001:未解析的外部符号"public:virtual int__thiscall findDialog::qt_metacall(enum QMetaObject::Call,int,void**)"(?qt_metacall@findDialog@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
LNK2001:未解析的外部符号"public:static struct QMetaObject const findDialog::staticMetaObject"(?staticMetaObject@findDialog@@2UQMetaObject@@B)
LNK2019:未解析的外部符号"protected:void __thiscall findDialog::findNext(class QString const&,enum Qt::CaseSensitivity)"(?findNext@findDialog@@IAEXABVQ字符串@@W4CaseSensitivity@Qt@@@Z) 在函数"private:void __thiscall findDialog::findClicked(void)"中引用(?findClicked@findDialog@@AAEXXZ)
LNK2019:未解析的外部符号"protected:void __thiscall findDialog::findPrevious(class QString const&,enum Qt::CaseSensitivity)"(?findPrevious@findDialog@@IAEXABVQ字符串@@W4CaseSensitivity@Qt@@@Z) 在函数"private:void __thiscall findDialog::findClicked(void)"中引用(?findClicked@findDialog@@AAEXXZ)
提前谢谢你,为我糟糕的英语感到抱歉。
由于您没有Qt Integration,我检查了我的一个Qt项目的设置。
在FindDialog.h
的property
页面上,将Item Type
从C/C++ header
更改为Custom Build Tool
。按下Apply
时,左侧会出现一个新的Custom Build Tool
项目。展开它,在General
中会找到Command Line
,输入
"$(QTDIR)binmoc.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)includeQtCore" "-I$(QTDIR)includeQtGui" ".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'ing FindDialog.h..."
CommandLine=""$(QTDIR)binmoc.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)includeQtCore" "-I$(QTDIR)includeQtGui" ".FindDialog.h" -o ".GeneratedFiles$(ConfigurationName)moc_$(InputName).cpp"
"
AdditionalDependencies=""$(QTDIR)binmoc.exe";.FindDialog.h"
Outputs="".GeneratedFiles$(ConfigurationName)moc_FindDialog.cpp""
/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Moc'ing FindDialog.h..."
CommandLine=""$(QTDIR)binmoc.exe" -DUNICODE -DWIN32 -DQT_THREAD_SUPPORT -DQT_CORE_LIB -DQT_GUI_LIB "-I.GeneratedFiles" "-I$(QTDIR)include" "-I.GeneratedFiles$(ConfigurationName)." "-I." "-I$(QTDIR)includeQtCore" "-I$(QTDIR)includeQtGui" ".FindDialog.h" -o ".GeneratedFiles$(ConfigurationName)moc_$(InputName).cpp"
"
AdditionalDependencies=""$(QTDIR)binmoc.exe";.FindDialog.h"
Outputs="".GeneratedFiles$(ConfigurationName)moc_FindDialog.cpp""
/>
</FileConfiguration>
</File>
请注意,这是来自VS2008的vcproj
。
也许你可以根据起亚的诊断和的进一步信息做大量的工作来解决你的问题
- 成功的宣言
- 一个源(1)基于
- QT论坛上相当典型的帖子(总结:预计会有问题)
但所有这些工作都不会进一步提高你的知识/技能,比如一般的wrt编程、c++或qt。如果Visual Studio对您来说很重要,请投资一个专业使用的不受限制的版本,并安装外接程序,避免为不适合的用途配置工具的麻烦。否则,请安装QT Creator(请参阅(2);Qt Creator IDE和工具)。
链接错误来自Qt's Meta Object Compiler
简单地说,当你在类中编写Q_OBJECT
宏时,它在类中定义了Qt处理事件所需的一些成员函数
Qt MOC将创建一个新的.cpp文件,并在其中写入这些函数的主体。
链接错误清楚地表明FindDilog的特定.cpp文件(名为moc_FindDialog.cpp
)丢失。这意味着moc文件不是由Qt生成的
也许Visual Studio忘记调用Qt-Moc来生成.cpp文件。也许Visual Studio编译器没有编译它…
确保findDialog.h明确包含在.pro文件中。如果不是,请添加它,并确保在尝试构建项目之前再次运行qmake。
- 静态数据成员的问题-修复链接错误会导致编译器错误
- Visual Studio mkl_link_tool.exe链接错误
- C++ 实现模板单例类时出现链接错误
- 使用类模板的方法链接错误
- MySQL C++连接器链接错误
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 运行 C++ 单元测试时LNK2005链接错误
- 对 CMake 中'cudaRegisterLinkedBinary'链接错误的未定义引用?
- 链接错误,包括我创建的相同头文件 - C++
- 在Embarcadero C++ Builder中生成的DLL未解决的外部链接错误
- 使用标头保护的多个定义链接错误
- 链接错误:未定义对 stdscr 和 wgetch 的引用
- 使用 Vivek 的 Vcam / 捕获源过滤器构建/链接错误
- 升压program_options中的链接错误
- 使用 g++ 预处理器进行替换会导致链接错误
- 在调试配置中编译工作正常,但发布会给出链接错误
- 相邻矩阵设置链接错误
- 包含常量变量并包含在多个文件中的标头的链接错误
- C++链接错误,我理解但无法解决
- 是什么导致macOS Mojave上的GoogleTest链接错误