在使用QT支持构建OpenCV时,未解析的符号QMetaObject

时间:2011-06-29 04:18:05

标签: qt opencv

我在使用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

3。将window_QT.cpp添加到VS2010中的opencv_highgui.vcxproj文件中,并在window_QT.cpp中添加以下宏
#define HAVE_QT
我还尝试将 QT_DLL 替换为 QT_NODLL ,但未成功。

4.添加目录#define HAVE_QT_OPENGL链接器属性页中的其他库目录。

5.在附加依赖项中添加以下库:
#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

6.最后,链接器报告错误:

#define QT_LARGEFILE_SUPPORT

5 个答案:

答案 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)

  
      
  1. 添加目录C:/QtSDK/Desktop/Qt/4.7.3/msvc2008/lib   在附加图书馆目录中   链接器属性页
  2.   

如果您使用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。因此,为了进行改装,我要做的事情如下。

对我来说,解决方法是:

  1. 手动创建一个名为QtDir的环境变量,并将其设置为开源项目随附的SDK或您下载的任何Qt库。
  2. 转到Visual Studio 2019,右键单击.H文件。转到属性。您会看到类似这样的内容。起初对我来说不明显的是可以单击“项目类型”。

Project File properties.

  1. 更改为“自定义构建步骤”。

enter image description here

  1. 转到项目,然后为所有配置输入“自定义构建步骤”(如果可能有多个文件的话),或者直接从该文件编辑构建步骤。

一些不错的宏,可能是新的: $(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之类的东西,

自定义步骤应如下所示:

Final Project custom settings

现在,您甚至还具有一个菜单项,用于编译该特定的.h文件,实际上,这似乎很奇怪。 .h文件未编译,包含在内。除了Qt。