5

我们已经为 VS2005 编译了 QT 4.6 和 QWT 5.2.0。

我们试图从 QwtDial 派生一个类,而派生类有插槽。所以,我们需要添加 Q_OBJECT 宏。但是,当我们这样做时,链接器会消除此错误:

错误 LNK2001:未解析的外部符号“公共:静态结构 QMetaObject const QwtDial::staticMetaObject”(?staticMetaObject@QwtDial@@2UQMetaObject@@B)

我用depends查看了Qwt.dll,它具有该功能。使用十六进制编辑器查看 .lib 文件显示它与该名称损坏的字符串完全匹配。

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

如果我们跳过 Q_OBJECT,那么一切都使用几个 QWT 小部件正确链接和绘制,包括我们的非 Q_OBJECT Qwt 派生类。

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

更新:

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

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

所以,它看起来像一些非常奇怪和非典型的东西。该符号肯定在库中。

4

5 回答 5

11

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

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

只是。没有其他的。我发现论坛参考指向调试/发布混淆的问题,并且可能与删除 Qt Designer 插件有关。

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

qmake 项目.pro

nmake 发布

于 2010-01-19T06:15:14.963 回答
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”的文件。

如果找不到任何匹配的文件,则需要使用您的派生类再次执行 qmake 过程...也许当您第一次使用 qmake 时,Q_OBJECT 宏尚未在类中,因此没有创建 moc 文件...

我希望它对你有一点帮助!

于 2010-01-08T06:09:48.670 回答
1

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

于 2010-04-21T11:37:23.693 回答
1

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

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

于 2010-07-05T09:44:31.863 回答
0

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

$ qmake -项目

$ qmake -tp vc

这就是为我解决问题的原因。阅读许多人给出的“看起来你有 moc 文件问题”的解释,让我不清楚该怎么做。

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

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

于 2011-04-17T04:03:40.343 回答