【问题标题】:including Qt headers in DLL包括 DLL 中的 Qt 头文件
【发布时间】:2009-07-15 19:38:32
【问题描述】:

我有一个 DLL,我想引用 QObject 并对其进行操作,而无需实际创建接口。因此,我包含了“Qt/qobject.h”并进行了编译,但编译器(Visual Studio 2008 pro)给了我语法错误。看起来它无法识别 QThread 对象。如何在我的 dll 中使用 QObject?这甚至可能吗?我必须从 Qt 应用程序启动我的程序吗?我实际上是在尝试设置一个系统范围的钩子并让第三个应用程序 QWidgets 来操作......知道如何在我的 dll 中使用 QObject 吗?

以下是错误:

1>------ Build started: Project: FroggerDLL, Configuration: Debug Win32 ------
1>Compiling...
1>FTClient.cpp
1>c:\qt-win-opensource-src-4.5.2\src\corelib\kernel\qobject.h(154) : error C2059: syntax error : 'type'
1>c:\qt-win-opensource-src-4.5.2\src\corelib\kernel\qobject.h(154) : error C2238: unexpected token(s) preceding ';'
1>c:\qt-win-opensource-src-4.5.2\src\corelib\kernel\qobject.h(155) : error C2144: syntax error : 'int' should be preceded by ')'
1>c:\qt-win-opensource-src-4.5.2\src\corelib\kernel\qobject.h(155) : error C2144: syntax error : 'int' should be preceded by ';'
1>c:\qt-win-opensource-src-4.5.2\src\corelib\kernel\qobject.h(155) : error C2059: syntax error : ')'
1>c:\qt-win-opensource-src-4.5.2\src\corelib\kernel\qobject.h(155) : error C2208: 'int' : no members defined using this type
1>FroggerDLL - 6 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 3 up-to-date, 0 skipped ==========

任何帮助将不胜感激,

谢谢

戴夫

【问题讨论】:

  • 我只是做了同样的事情 Troubadour 做的,但在 VS2010 中,它也工作得很好。发生了一些可疑的事情......

标签: qt dll visual-c++


【解决方案1】:

第 154 行是什么?我的只是声明

QThread* thread() const;

但在 Linux 上是 4.5.1,所以它可能会有所不同。第 204 行对涉及标记 type 的任何内容的第一个引用是 Qt::ConnectionType 类型的变量。

顺便说一句。我刚刚尝试在我的系统上编译以下内容(在文件 incqobj.cpp 中)

include <QOObject>
QObject myQOject;

g++ -I/usr/lib/qt4/include -I/usr/lib/qt4/include/QtCore -c incqobj.cpp

它编译得很好,所以应该就这么简单。

编辑:由于 Jesse 确认它在 Windows 上适用于他,我很想说您有一个非 Qt 宏进入并进行干扰。您可以做的一件事是通过让 VS 仅生成预处理源而不是进行编译,对编译器实际看到的内容进行健全性检查。

我已经好几年没用过 VS 了,但我认为选项是 \E 可能吗? [编辑:见 Jesse 的第二条评论,应该是 /E] 现在它也可能是编译器属性中的一个显式选项,可以为该源文件设置。也不记得它把输出放在哪里,所以你可能需要四处寻找它!如果你能做到这一点,你可以检查代码是否正确地位于原始 QObject 标头中与第 154 行对应的部分。

【讨论】:

  • 这也是windows下4.5.0的样子。奇怪的错误和 QThread 是前向声明的,所以如果他只是创建对象,应该不会有任何问题。
  • 对预处理器输出的良好调用。 /E 正确:msdn.microsoft.com/en-us/library/3xkfswhy.aspx
【解决方案2】:

感谢所有帮助,解决方案:我必须在所有其他包含之前包含 Qt 标头,现在它可以编译了。

再次感谢!

【讨论】:

  • 啊,所以它一个非 Qt 宏干扰。很高兴知道它已排序,但如果你知道哪个标题是我有兴趣知道的违规标题。
  • 干扰Qt的是Stdafx.h头文件
【解决方案3】:

尝试包含 QThread 吗?

#include <QThread>

Qt 广泛使用前向声明,有时您需要包含额外的标头。

编辑:

您是否设置了任何定义?这是我的 2003 Qt 商业 (4.3.4) 项目(链接到 Qt dll 的可执行文件):

QT_LARGEFILE_SUPPORT
QT_DLL
QT_GUI_LIB
QT_CORE_LIB
QT_THREAD_SUPPORT
QT_NETWORK_LIB

【讨论】:

  • 我没有设置任何定义。我刚刚开始这个项目,唯一的“Qt 代码”行是我的#include“Qt/qobject.h”,现在是#include“Qt/qthread.h”。我真的不知道发生了什么,以及为什么我似乎不能像这样使用 Qt 标头。
  • 是的,我认为您需要这些定义。至少那些:QT_DLL QT_GUI_LIB QT_THREAD_SUPPORT。它们对标头有很大影响,尤其是像 QObject 这样的基本标头。您是否尝试过使用 VS 集成? (还是只有这个商业版?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多