2010-01-07 38 views
5

我们已经编译了VS2005的QT 4.6和QWT 5.2.0。Qt,VS2005,Qwt - 无法使用派生自Qwt小部件的类中的Q_OBJECT

我们试图从QwtDial派生一个类,派生类有插槽。所以,我们需要添加Q_OBJECT宏。然而,当我们这样做,链接器呛出这个错误:

错误LNK2001:无法解析的外部符号 “公用:静态结构QMetaObject常量QwtDial :: staticMetaObject”(?staticMetaObject @ QwtDial @@ 2UQMetaObject乙@@)

我已经看着Qwt.dll与依赖,并且它具有该功能。使用十六进制编辑器查看.lib文件显示它具有与该名称重叠的字符串完全匹配的内容。

我们在路径中有Qwt库。实际上,如果我重命名这个lib,那么它会给出一个错误,它找不到这个lib文件。所以,我们知道它正在寻找正确的lib。

如果我们跳过Q_OBJECT,那么所有东西都会使用几个QWT小部件(包括我们的非Q_OBJECT Qwt派生类)正确链接和绘制。

有谁知道什么会导致这个真烦人的链接器问题?

UPDATE:

我已验证我添加了Q_OBJECT的类肯定是​​越来越为其生成一个MOC文件。链接器错误实际上来自这个生成的MOC文件:

moc_GaugeWidget1.obj : error LNK2001: unresolved external symbol "public: static 
    struct QMetaObject const QwtDial::staticMetaObject" 
    ([email protected]@@[email protected]@B) 

因此,它看起来像是一些非常典型和非常规的东西。该符号绝对在lib中。

回答

11

我遇到同样的问题。那么,我正在使用Qt4.4和VC2003更新一个旧项目,而我正在使用QwtPlot而不是QwtDial。错误是:

LNK2001:无法解析的外部符号 “公用:静态结构QMetaObject常量QwtPlot :: staticMetaObject”(staticMetaObject @ QwtPlot @@ 2UQMetaObject @@ B')

这一点。没有其他的。我发现论坛参考文献指出了调试/发布混音的问题,并且可能与删除Qt Designer插件有关。

这似乎对我很有用: 将行:“DEFINES + = QWT_DLL”添加到project.pro文件的顶部。

QMAKE project.pro

NMAKE释放

+1

+1:谢谢,它帮助!我认为,QWT中缺少定义开关。就像“如果在这个库中使用,将QWT_DLL设置为Q_DECL_EXPORT,否则将QWT_DLL设置为空”。这就是为什么你应该设置QWT_DLL手动清空,如果使用QWT头。 – 2011-07-05 12:53:43

+0

谢谢,它确实有效! – 2012-04-19 13:03:19

1

我不知道这个答案,但这里有一些信息:

在我看来,你的派生类中没有一个匹配moc_文件! moc文件通常在使用Q_OBJECT宏时使用......您项目的moc信息存储在Makefile,Makefile.debug和Makefile.release文件中!正是这个文件告诉哪个.cpp文件需要一个moc文件,哪个不需要。

可以在QtAssistant找到关于MOC文件:http://qt.nokia.com/doc/4.6/moc.html

现在,检查这一点,你需要在你的“生成”去夹,然后查找一个名为“moc_yourDerivedClass.cpp”文件。

如果找不到任何匹配的文件,则需要使用yourderivedClass再次通过qmake进程...也许当您第一次使用qmake时,Q_OBJECT宏还没有在类中,因此没有moc文件已创建...

我希望它可以帮助你一点!

+0

我会建议你的东西,它可能不可实现,但可能会有助于期货项目。我正在使用我的一位朋友开发的脚本包。你可以在这里找到它: http://www.dprog.n​​et/joomla/index.php?option=com_content&view=article&id=39:qt-integration-scripts&catid=32:qt-integration-scripts&Itemid=47 那里做一个小小的工作来设置它,比如说明你正在使用哪个VS,哪个Qt版本,你的.PRO文件在哪里等等。然后,其他的一切都会自动完成,添加新的文件,创建。 PRI文件,vcproj文件...非常好... – 2010-01-08 07:18:30

+0

例如,当我添加一个文件时,我将它放在正确的文件夹中,放在我的.PRO文件旁边。我启动了一个名为“generate_vcproj.bat”的脚本,脚本生成了一切......然后我使用“Launch_ide.bat”,我的VS也启动了所有设置(moc文件) – 2010-01-08 07:21:33

+0

至于这个答案,不......这肯定是MOC文件。 (moc_GaugeWidget1.obj:error LNK2001:无法解析的外部符号“public:static struct QMetaObject const QwtDial :: staticMetaObject”(?staticMetaObject @ QwtDial @@ 2UQMetaObject @@ B))...所以,还有一些其他问题/错误正在进行。 – darron 2010-01-12 15:57:35

1

问题是与交通部file.You应QwtPlot定义中使用Q_DECL_EXPORT(或者一些别的东西喜欢它),它告诉编译器这个类是其他图书馆使用但在moc文件dosn't中生成的类的部分包含这些,所以当您将这些库链接到其他程序时,它不知道如何链接这些部分。 无论如何,我不知道如何告诉这些Qt!

1

与qwt 5.2.1,qt 4.6和VS2008完全相同的问题。相同的代码在Linux中完美编译。 所有moc文件都正确生成和处理,没有发布/调试混合库,我将在有空的时候将它报告给qwt错误。

将QWT_DLL添加到定义列表(项目属性 - > C++ - >预处理器 - >定义)确实可以解决问题!

0

尝试在项目目录中再次运行qmake。

$ qmake的-project

$ QMAKE -tp VC

这是固定的问题对我来说。阅读许多人给出的“看起来像你有moc文件问题”的解释,让我不清楚该怎么做。

我想我在这一个上造成了我自己的问题。在构建整个项目之前,我右键单击并编译了我的项目中的.ui文件。不知何故,这并没有完全生成所有需要的文件。无论如何,如果你突然遇到以前不存在的问题,运行qmake是一件有用的事情。

但是,在我的项目设置中还有一件事我注意到了,没有设置预处理器指令。运行qmake再次解决了这个问题。