在DLL中包含Qt头文件

3

我有一个 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 中也可以正常工作。似乎有些可疑的事情正在发生... - Jesse Vogt
3个回答

1
第154行是什么?我的只是声明。
QThread* thread() const;

但这是在Linux上的4.5.1版本,所以可能会有所不同。与令牌type有关的第一个参考是位于第204行,它是一个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是前置声明的,所以如果他只是在那里创建对象,不应该有任何问题。 - Jesse Vogt
预处理器输出方面做得不错。/E 是正确的:http://msdn.microsoft.com/zh-cn/library/3xkfswhy.aspx - Jesse Vogt

1

感谢所有的帮助,问题已解决:我必须在所有其他包含文件之前包含Qt头文件,现在可以编译了。

再次感谢!


啊,原来是一个与Qt无关的宏干扰了。知道问题已解决让人感到很好,不过如果你最后弄清楚是哪个头文件出了问题,我会很感兴趣知道的。 - Troubadour
是Stdafx.h头文件与Qt发生了冲突。 - David Menard

0

试着包含 QThread ?

#include <QThread>

Qt在前置声明方面使用得非常广泛,有时需要包含额外的头文件。
编辑:
你设置了任何定义吗?这是我为我的2003年Qt商业(4.3.4)项目设置的内容(可执行文件链接到Qt dlls):
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 标头文件。 - David Menard
是的,我认为你需要这些定义。至少这些:QT_DLL QT_GUI_LIB QT_THREAD_SUPPORT。 它们对头文件有很大影响,特别是像QObject这样基本的头文件。你尝试使用VS集成了吗?(还是这只适用于商业版本?) - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接