C++ Qt元对象链接器问题
在将Qt与Vs集成并尝试编译.pro文件后,我遇到以下错误:C++ Qt元对象链接器问题,c++,visual-studio-2010,qt,C++,Visual Studio 2010,Qt,在将Qt与Vs集成并尝试编译.pro文件后,我遇到以下错误: Error 9 error LNK2001: unresolved external symbol "public: virtual int __thiscall Multiplication_dialog::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Multiplication_dialog@@UAEHW4Call@QMetaObject@
Error 9 error LNK2001: unresolved external symbol "public: virtual int __thiscall Multiplication_dialog::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@Multiplication_dialog@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
Error 7 error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall Multiplication_dialog::metaObject(void)const " (?metaObject@Multiplication_dialog@@UBEPBUQMetaObject@@XZ)
Error 8 error LNK2001: unresolved external symbol "public: virtual void * __thiscall Multiplication_dialog::qt_metacast(char const *)" (?qt_metacast@Multiplication_dialog@@UAEPAXPBD@Z)
该怎么办?当foo.h的moc_foo.cpp(包含用Q_对象标记的类)未在项目中编译/链接时,通常会出现这些错误 要使Qt项目在VS中工作
- 确保相关对象的头文件出现在VS项目中
- 列表项
- 从乘法对话框的头文件中删除Q_对象的所有出现
- 保存文件
- 再次添加Q_对象
- 保存文件
因此,您需要为您的类编写两个文件:Multiplication\u dialog.h和Multiplication\u dialog.cpp!您必须重新创建makefile 今天我可能遇到了同样的问题。我知道这根线很旧了。但它仍然可以帮助某些人
我的情况是
moc
正在生成moc.cpp
文件,但VC不知道它也必须编译它们。所以我手动添加了那些moc生成的文件,以便进行编译。它成功了 我今天遇到了同样的链接器错误,但这是由于一个小失误:
我手动将cpp/ui文件添加到项目中,但忘记将头文件显式添加为头文件。现在,在编译时,我收到了与上述类似的错误消息,并且在构建的debug(或release)目录中没有生成moc*.cpp文件。
这并不是一个明显的错误,qmake没有抱怨,除了链接器消息之外,我没有收到任何错误
因此,如果任何人再次遇到相同的问题(或犯了相同的复制错误):
确保头文件也已添加到您的项目文件中当我将Qt Addin用于VS时发生了相同的问题,我看到moc文件
在生成后未包含在项目中。我把它们包括在项目中,这些错误都消失了 我目前正在使用VS 2013和QT 5.4插件。使用外接程序构建项目会更容易,因为moc’ing是自动处理的。要防止Qt元对象问题的链接器错误问题,请执行以下操作:
注释掉类声明中包含Q_对象的所有头文件中Q_对象的所有实例
构建解决方案
取消注释头文件中Q_对象的所有实例
重建解决方案。这是所有头文件和cpp文件重新编译的地方,moc’ing自动完成。链接器错误将依次得到处理
尝试重新启动项目的.pro。上面一些相当冗长的解释。
使用Qt Creator,在菜单栏上:
构建>运行qmake
Build>Build All#Job或我正在使用qt addin(我希望这就是您所说的vs addin)检查您的vsproj中是否包含moc\u multiply\u dialog.cpp。如果错过了,@jobor是对的)是的,我指的是Qt插件。问题是您的类乘法对话框有一个Q_对象宏,但没有创建或编译moc_乘法对话框.cpp(我只能猜测文件名)。为什么有必要这样做?因为VS的一些错误配置阻止了moc文件的使用。有时,即使它正确地生成moc文件,但由于没有包含这些文件,它的行为就像它不存在一样。最后将其包含在源文件中?如果VS没有处理它,则需要一些东西。这也是使用cmake时的一个良好做法。如果您使用IDE不可知,它将适用于任何构建系统。QtCreator附带的一些示例包括项目中的.moc文件。所以结论是,虽然包含头文件似乎更正确,但包含moc文件是完全有效的。从一本暂时为我工作的书中获得信息真的很有帮助。谢谢我将看看它是否能在应用程序继续构建时保持不变。这不仅适用于.cpp,也适用于.H。我们定义了一个纯抽象作为我们定义的接口,但它有一个非虚拟信号。这意味着.h必须在源代码中,才能在CMakeLists.txt文件中编译,因此它将是moc'd。