代码之家  ›  专栏  ›  技术社区  ›  darron

Qt、VS2005、Qwt-无法在从Qwt小部件派生的类中使用Q_对象

  •  5
  • darron  · 技术社区  · 16 年前

    我们已经为VS2005编译了Qt4.6和Qwt5.2.0。

    错误LNK2001:未解析的外部符号“public:static struct QMetaObject const QwtDial::staticMetaObject”(?staticMetaObject@QwtDial@@2UQMetaObject@@B)

    我用depends查看了Qwt.dll,它有这个函数。使用十六进制编辑器查看.lib文件时,会发现该文件与名称已损坏的字符串完全匹配。

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

    如果我们跳过Q_对象,那么所有内容都使用几个QWT小部件正确链接和绘制,包括我们的非Q_对象QWT派生类。

    有人知道是什么导致了这个非常恼人的链接器问题吗?

    更新:

    我已经验证了我添加Q_对象的类肯定会生成一个MOC文件。链接器错误实际上来自此生成的MOC文件:

    moc_GaugeWidget1.obj : error LNK2001: unresolved external symbol "public: static
        struct QMetaObject const QwtDial::staticMetaObject" 
        (?staticMetaObject@QwtDial@@2UQMetaObject@@B)
    

    所以,它看起来像是一种非常难闻和非典型的东西。符号肯定在库中。

    5 回复  |  直到 16 年前
        1
  •  11
  •   Michael    16 年前

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

    LNK2001:未解析的外部符号“public:static struct QMetaObject const QwtPlot::staticMetaObject”(?staticMetaObject@QwtPlot@@2UQMetaObject@@B)

    就这样。没有别的了。我发现论坛引用指出了调试/发布混搭的问题,可能与删除Qt设计器插件有关。

    在project.pro文件的顶部添加一行:“DEFINES+=QWT_DLL”。

    qmake project.pro

    nmake释放

        2
  •  1
  •   Andy M    16 年前

    我不确定这个答案,但这里有一些信息:

    您可以在QtAssistant中找到有关moc的文档: http://qt.nokia.com/doc/4.6/moc.html

    现在,要检查这一点,您需要进入“生成”文件夹并查找名为“moc_yourDerivedClass.cpp”的文件。

    我希望它能帮你一点忙!

        3
  •  1
  •   bahman    16 年前

    问题在于moc文件。你应该在QwtPlot定义中使用Q_DECL_EXPORT(或类似的东西),它告诉编译器这个类可以被其他库使用,但在moc文件中生成的类的部分不包含这些,所以当你将这些库与其他程序链接时,它不知道如何链接这些部分。 不管怎样,我不知道怎么把这些告诉Qt!

        4
  •  1
  •   Slava    16 年前

    所有moc文件都已正确生成和处理,没有发布/调试混合库,我将在有时间时向qwt bugs报告。

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

        5
  •  0
  •   JBird    15 年前

    $qmake-项目

    $qmake-tpvc

    这就是我解决问题的方法。读了很多人对“看起来你有moc文件问题”的解释,我不清楚该怎么办。

    然而,我在项目设置中注意到另一件事,没有设置任何预处理器指令。再次运行qmake修复了这个问题。