我在使用QT支持构建OpenCV_HighGui220d.lib时遇到问题。 问题是关于 QMetaObject 的未解决的符号,例如:
public: virtual struct QMetaObject const * __thiscall GuiReceiver::metaObject(void)const (?metaObject@GuiReceiver@@UBEPBUQMetaObject@@XZ)
我的环境:
- Visual Studio 2010
- OpenCV 2.2
- QT SDK版本:4.7.3
以下是我的建设步骤:
1.使用CMake打开C:\OpenCV2.2
,检查 WITH_QT 和 WITH_QT_OPENGL ,生成vcxproj和sln文件。
2。在cvconfig.h
中添加以下宏:
#define HAVE_QT
#define HAVE_QT_OPENGL
#define HAVE_QT
我还尝试将 QT_DLL 替换为 QT_NODLL ,但未成功。#define HAVE_QT_OPENGL
链接器属性页中的其他库目录。#define QT_LARGEFILE_SUPPORT
#define QT_DLL
#define QT_GUI_LIB
#define QT_CORE_LIB
#define QT_HAVE_MMX
#define QT_HAVE_3DNOW
#define QT_HAVE_SSE
#define QT_HAVE_MMXEXT
#define QT_HAVE_SSE2
#define QT_THREAD_SUPPORT
#define QT_LARGEFILE_SUPPORT
答案 0 :(得分:6)
Qt MOC(元对象编译器)没有在你的Qt类文件上运行。
由于您是从OpenCV版本构建的,我假设UI类在类声明中已经有一个Q_OBJECT行。
要生成具有运行MOC所需构建说明的.vcproj文件,请运行以下命令:
qmake -tp vc -r <yourProFile.pro>
如果这不起作用,请右键单击包含Qt类的.h文件之一。在Properties-&gt; Custom Build Step-&gt; General下,您应该看到如下内容:
Command Line "$(QTDIR)\bin\moc.exe" -I".\GeneratedFiles\." -I"$(QTDIR)\include\." -I".\GeneratedFiles\$(ConfigurationName)\." -I"$(QTDIR)\include\QtCore\." -I"$(QTDIR)\include\QtGui\." .\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp" "-fstdafx.h" "-f[YourQtFile.h]"
Description Moc'ing $(InputFileName)...
Outputs ".\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp"
Additional Dependencies "$(QTDIR)\bin\moc.exe";$(InputPath)
希望这有帮助。
答案 1 :(得分:0)
- 添加目录C:/QtSDK/Desktop/Qt/4.7.3/msvc2008/lib 在附加图书馆目录中 链接器属性页
醇>
如果您使用vs2010进行构建,我建议您添加使用vs2010编译的库的dir ...您的路径可能是指vs2008库。
答案 2 :(得分:0)
这可能有助于某人:
我为我制作的新QOBJECT类遇到了这个错误,在重新运行qmake(Build-&gt; Run qmake),然后重建后它就消失了。
答案 3 :(得分:0)
虽然反应很晚.... 我按照以下步骤去除了上述错误:
1)为Visual Studio版本安装OpenSource QT Version或QT。 2)在Visual Studio中安装visual studio QT插件[http://qt.nokia.com/downloads/visual-studio-add-in]。 3)使用QT创建项目而不是正常的视觉工作室项目。创建的QT项目将自动成为一个视觉工作室项目。
FOR existign QT项目..... 1)从QT菜单打开项目,而不是从Visual Studio的“文件”菜单中打开。
希望这个帮助...............我花了两天的时间来完成这项工作。
答案 4 :(得分:0)
我知道这个问题/答案有点老了,但是我碰到这个问题是因为它恰好是同一问题,所以它仍然存在。我们有一个开源项目,有点麻烦。它同时使用了WxWidgets和QT5(开源)。但是,实际上没有任何内容可以运行moc编译器,因此在尝试使用某些线程类时出现了主题错误。
如果您安装Qt5,则可以“完成”这一步骤,但是我已经尝试过了,但是还没有通过链接步骤。我正在使用的源代码将所有内容与一个可以正确运行cmake的批处理文件捆绑在一起-只是不包括MOC。因此,为了进行改装,我要做的事情如下。
对我来说,解决方法是:
一些不错的宏,可能是新的: $(GeneratedFileExtension)是.g.cpp;但实际上,在项目建立时,它似乎是空的。所以我手动输入.g.cpp。 %(身份) %(文档名称) 但使用%(FullFilePath)
@Gnawme的答案使我成为其中的一部分,但是$ {InputFileName)在VS2019中不起作用。 (很有可能是MS向前发展了...)。另外,moc编译器似乎并不需要-f“ filename.h”,而只是想要filename.h
因此,自定义构建步骤的最后一个“命令行”是:
$(QTDIR)bin\moc.exe -I".\GeneratedFiles\." -I"$(QTDIR)\include\." -I".\GeneratedFiles\$(ConfigurationName)\." -I"$(QTDIR)\include\QtCore\." -I"$(QTDIR)\include\QtGui\." -o".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).g.cpp" "%(FullPath)"
请注意,如果在可执行文件路径两边加上引号,则会出现有关路径中无效字符的奇怪错误。
然后,您需要描述:
Moc'ing %(FileName) to produce %(Filename).g.cpp
输出将是:
.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).g.cpp
现在……我尝试了一件棘手的事情;从下拉列表中更改“将输出添加到项目类型”,然后更改“ C / C ++编译器”。这意味着生成的文件将被自动编译,而无需将它们“添加”到项目中。
..除了没有用。有点骨头,但只需要做一次。文档实际上提到了这一点:
如果您希望构建系统在由...生成的输出文件上运行 自定义构建工具,您必须手动将其添加到项目中。的 自定义构建工具将在构建过程中更新文件。
嗯!这很容易,但是第一次进行构建时,它将因链接器错误而失败,这是找到.g.cpp文件并将其添加的线索。我添加了“ .g”,以便很明显这是一个生成的文件;如果您尝试编辑文件,则会有很多警告。不过,这样一来,您可以.gitnore之类的东西,
自定义步骤应如下所示:
现在,您甚至还具有一个菜单项,用于编译该特定的.h文件,实际上,这似乎很奇怪。 .h文件未编译,包含在内。除了Qt。