首页 Qt Qt Creator 插件开发(1):编译 Qt Creator

Qt Creator 插件开发(1):编译 Qt Creator

41 5

Qt Creator 是 Nokia 在收购 Qt 之后于 2009 年早期推出的一款 IDE。在一定程度上,Qt Creator 也是 Qt 开发的主要 IDE。从技术架构角度来说,Qt Creator 可以看做是一个插件平台,其大部分功能都是以插件的形式提供的。

本系列文章将着重介绍如何开发 Qt Creator 插件,以扩展 Qt Creator 的现有功能。虽然 Qt Creator 的最新版本已经提供了插件项目,但是从最底层开发 Qt Creator 插件,对于理解其架构也有相当的作用。因此,本文将不依赖于 Qt Creator 提供的项目向导,而是直接以 .pro 文件创建插件。同时,希望在学习 Qt Creator 插件开发基础之上,了解 Qt Creator 的架构。本系列文章原文出自 http://www.vcreatelogic.com/downloads/files/Writing-Qt-Creator-Plugins.pdf

本系列文章在 Windows 平台上,使用 mingw 版本 Qt 进行测试。Linux 平台请自行进行修改。

当我们从 http://qt.nokia.com/downloads 下载 QtSDK 时,我们已经获得了最新版本的 Qt Creator 。如果你下载的是 Windows 平台 mingw 版本的 QtSDK,其中包含的 Qt Creator 是使用 MSVC 进行编译的,而 Qt Framework 和 Qt Designer 则使用的是 mingw(这也就是为什么有时候我们的插件能够在 Qt Designer 找到,但在 Qt Creator 却看不到)。因此,如果我们要使用 mingw 版本的 QtSDK 进行 Qt Creator 插件开发,需要自己编译 Qt Creator 。如果未来版本,QtSDK 提供的 Qt Creator 也是 mingw 编译的,那么,我们最好还是自己手动编译一下 Qt Creator 。这样我们就可以获得一个 debug 版本的 Qt Creator ,从而更有利于插件的调试。(这里说明一下,Windows 平台下的 Qt Creator 之所以提供 MSVC 版本的,完全是技术原因。因为 mingw 缺少一些 Qt Creator 所必需的 Windows API。)

这个页面上,我们可以找到 Qt Creator 源代码的下载链接:http://qt.nokia.com/downloads/qt-creator-source-package。在本文写作时,Qt Creator 最新版本是 2.2.1。我们下载下来一个 zip 压缩包,解压之后,我们在与 Qt Creator 源代码平级的目录中创建一个 build 文件夹,用于放置编译后的文件,以免编译的过程文件同源代码混在一起(build 文件夹必须与 Qt Creator 源代码文件夹平级,这是 qmake 做 shadow build 时的要求)。于是,现在的目录结构如下所示:

QtCreator 目录结构

新版本的 Qt Creator 提供了一个 Qt Quick Designer,用于 Qt Quick 的可视化设计。不过,这个插件需要用到 Qt 的私有头文件。如果你是从 Nokia 直接下载的 QtSDK(就像上文说明的那样)安装,是没有这些私有头文件的。解决的办法是下载 Qt 的源代码(可以在 Qt libraries 这里找到一个 zip 的下载地址)。(这是 Qt Creator 已知的一个 bug,可以在这里找到详细信息。)在下载 Qt 源代码之后,将 {Qt-source-code}\src\corelib\kernel\qwineventnotifier_p.h 复制到 {QtSDK-path}\Desktop\Qt\4.7.3\mingw\include\QtCore\private 这个文件夹下(没有的话请自行创建)。

然后,我们运行“开始菜单\Qt SDK\Desktop\Qt 4.7.3 for Desktop (MinGW)”。此时会启动已经设置好 Qt 环境变量的命令提示符界面。然后使用 cd 命令,进入我们刚刚创建的 build 文件夹。执行命令:

qmake ../qtcreator.pro "QT_PRIVATE_HEADERS=D:/Develop/QtSDK/Desktop/Qt/4.7.3/mingw/include"

其中,D:/Develop/QtSDK/Desktop/Qt/4.7.3/mingw/include 这个路径用于指定 Qt include 文件夹的位置。配置结束后,使用

mingw32-make

开始真正的编译(由于我们使用的是 mingw 版本的 QtSDK,所以使用 mingw32-make。当然,你也可以使用 nmake 使用 MSVC 进行编译。不过前面已经说过,我们这篇文章是基于 mingw 的)。经过一段时间的编译(豆子的笔记本花了大概 75 分钟,硬盘占用 2.5G),如果没有错误的话(豆子在编译时会有找不到 qwineventnotifier_p.h 文件,在执行前面的修复之后即可通过。另外还可能会有一个找不到 ide_version.h 文件。如果出现这个问题,可以将 build\src\plugins\coreplugin 目录中的 ide_version.h,复制到 {qtcreator-2.2.1-src}\src\plugins\coreplugin),我们就会在 build\bin 下面找到 qtcreator.exe 可执行文件。双击运行一下,如果一切正常,那么恭喜你!一个 debug 版本的 Qt Creator 已经编译完成了!(可能会有找不到 dll 的错误,如果出现的话请自行修复路径。启动我们编译的 Qt Creator 会很慢,因为这是 debug 版本的。)

最后强调一点,一定要从源代码编译 Qt Creator ,否则,后面的插件开发的编写和测试工作可能会有许多问题。

41 评论

duguqiusui 2012年10月21日 - 02:13

编译Qt creator出错:
Qt:Untested windows version 6.2 detected。
我的系统是win8, 请问是什么原因?谢谢!!!

回复
DevBean 2012年10月21日 - 09:29

看错误提示,应该是因为现在 Qt 还不支持 Windows 8,只好等以后 Qt 支持之后再进行编译。

回复
great 2013年1月19日 - 15:02

应该是QtCreator不支持吧 Qt是支持的

回复
豆子 2013年1月21日 - 10:17

在那个时候可能还不支持。这条评论发表于2012年10月,不过现在貌似已不可考了 ;-P

回复
great 2013年1月22日 - 18:00

可考 我2012年8月就在Win8上用了Qt5

豆子 2013年1月23日 - 10:05

那这个的确不清楚啦,没准儿是 Qt Creator 不支持 ;-P

duguqiusui 2012年10月21日 - 11:18

我重装了win7,然后编译Qt creator,切换到build目录下,已包含那个头文件,用的代码如下:
qmake ../qtcreator.pro “QT_PRIVATE_HEADERS=F:\QtSDK\Desktop\Qt\4.8.1\mingw\include”
然后提示编译出错:
Cannot find file:..\qtcreator.pro
请问是怎么回事?谢谢!

回复
duguqiusui 2012年10月21日 - 11:26

现在又出现了如下错误:
"qmake"不是内部或外部命令,也不是可运行的程序或批处理文件
我的Qt是官网下的那种直接安装的,不需要编译的

回复
duguqiusui 2012年10月21日 - 12:22

我现在弄好了,博主的那个qmake命令应该如下:
qmake ../qt-creator-2.2.1-src/qtcreator.pro “QT_PRIVATE_HEADERS=D:/Develop/QtSDK/Desktop/Qt/4.7.3/mingw/include”

回复
DevBean 2012年10月22日 - 14:04

按照 Qt Creator 里面的 ReadMe 文件的说明,如果你不需要 QML 插件,就不需要添加 Qt private 头文件。

回复
duguqiusui 2012年10月22日 - 21:57

谢谢博主,博主能不能做一些关于QML或者是QSS的文章?
感激不尽!

回复
DevBean 2012年10月23日 - 09:07

会的,因为 QML 已经是 Qt5 的重要组成部分,所以在《Qt 学习之路 2》的章节中肯定会涉及到 QML 的 ;-P

回复
米米 2013年3月28日 - 15:44

collect2: ld returned 1 exit status
mingw32-make[3]: *** [..\..\..\lib\qtcreator\Aggregationd.dll] Error 1
mingw32-make[3]: Leaving directory `D:/Git/bin/qt-creator/build/src/libs/aggrega
tion'
mingw32-make[2]: *** [debug] Error 2
mingw32-make[2]: Leaving directory `D:/Git/bin/qt-creator/build/src/libs/aggrega
tion'
mingw32-make[1]: *** [sub-libs-aggregation-make_default-ordered] Error 2
mingw32-make[1]: Leaving directory `D:/Git/bin/qt-creator/build/src'
mingw32-make: *** [sub-src-make_default-ordered] Error 2

执行中出现上面的错误。。郁闷了

回复
豆子 2013年3月29日 - 12:50

这个并没有给出错误信息,再向上找找是有错误信息的

回复
米米 2013年4月11日 - 16:13

D:\Git\bin\qt-creator\build\src\libs\aggregation/../../../../src/libs/aggregatio
n/aggregate.cpp:217: undefined reference to `_imp___ZN7QObjectD2Ev'
D:\Git\bin\qt-creator\build\src\libs\aggregation/../../../../src/libs/aggregatio
n/aggregate.cpp:209: undefined reference to `_imp___Z13qFlagLocationPKc'
D:\Git\bin\qt-creator\build\src\libs\aggregation/../../../../src/libs/aggregatio
n/aggregate.cpp:209: undefined reference to `_imp___Z13qFlagLocationPKc'
D:\Git\bin\qt-creator\build\src\libs\aggregation/../../../../src/libs/aggregatio
n/aggregate.cpp:209: undefined reference to `_imp___ZN7QObject10disconnectEPKS_P
KcS1_S3_' 谢谢豆子老师了。

回复
豆子 2013年4月11日 - 19:15

不清楚是不是路径的问题?看错误信息应该是在编译 aggregation 时找不到某个库。

回复
米米 2013年4月12日 - 08:41

噢。我再试试。。这是PRO里的内容。
include(qtcreator.pri)

#version check qt
!minQtVersion(4, 8, 0) {
message("Cannot build Qt Creator with Qt version $${QT_VERSION}.")
error("Use at least Qt 4.8.0.")
}

include(doc/doc.pri)

TEMPLATE = subdirs
CONFIG += ordered

SUBDIRS = src share lib/qtcreator/qtcomponents
unix:!macx:!isEmpty(copydata):SUBDIRS += bin

OTHER_FILES += dist/copyright_template.txt \
$$files(dist/changes-*) \
qtcreator.qbp \
qbs/pluginspec/pluginspec.qbs

macx: PLATFORM = "mac"
else:win32: PLATFORM = "windows"
else:linux-*: PLATFORM = "linux-$${QT_ARCH}"
else: PLATFORM = "unknown"

PATTERN = $${PLATFORM}$(INSTALL_EDITION)-$${QTCREATOR_VERSION}$(INSTALL_POSTFIX)

macx {
APPBUNDLE = "$$OUT_PWD/bin/Qt Creator.app"
BINDIST_SOURCE = "$$OUT_PWD/bin/Qt Creator.app"
BINDIST_INSTALLER_SOURCE = $$BINDIST_SOURCE
deployqt.commands = $$PWD/scripts/deployqtHelper_mac.sh \"$${APPBUNDLE}\" \"$$[QT_INSTALL_TRANSLATIONS]\" \"$$[QT_INSTALL_PLUGINS]\"
codesign.commands = codesign -s \"$(SIGNING_IDENTITY)\" $(SIGNING_FLAGS) \"$${APPBUNDLE}\"
dmg.commands = $$PWD/scripts/makedmg.sh $$OUT_PWD/bin qt-creator-$${PATTERN}.dmg
dmg.depends = deployqt
QMAKE_EXTRA_TARGETS += codesign dmg
} else {
BINDIST_SOURCE = "$(INSTALL_ROOT)$$QTC_PREFIX"
BINDIST_INSTALLER_SOURCE = "$$BINDIST_SOURCE/*"
deployqt.commands = $$PWD/scripts/deployqt.py -i \"$(INSTALL_ROOT)$$QTC_PREFIX\"
deployqt.depends = install
win32 {
deployartifacts.depends = install
deployartifacts.commands = git clone "git://gitorious.org/qt-creator/binary-artifacts.git"&& xcopy /s /q /y /i "binary-artifacts\\win32" \"$(INSTALL_ROOT)$$QTC_PREFIX\"&& rmdir /s /q binary-artifacts
QMAKE_EXTRA_TARGETS += deployartifacts
}
}

INSTALLER_ARCHIVE = $$OUT_PWD/qt-creator-$${PATTERN}-installer-archive.7z

bindist.depends = deployqt
bindist.commands = 7z a -mx9 $$OUT_PWD/qt-creator-$${PATTERN}.7z \"$$BINDIST_SOURCE\"
bindist_installer.depends = deployqt
bindist_installer.commands = 7z a -mx9 $$OUT_PWD/qt-creator-$${PATTERN}-installer-archive.7z \"$$BINDIST_INSTALLER_SOURCE\"
installer.depends = bindist_installer
installer.commands = $$PWD/scripts/packageIfw.py -i \"$(IFW_PATH)\" -v $${QTCREATOR_VERSION} -a \"$$INSTALLER_ARCHIVE\" "qt-creator-$${PATTERN}"

win32 {
deployqt.commands ~= s,/,\\\\,g
bindist.commands ~= s,/,\\\\,g
bindist_installer.commands ~= s,/,\\\\,g
installer.commands ~= s,/,\\\\,g
}

QMAKE_EXTRA_TARGETS += deployqt bindist bindist_installer installer

是不是因为我下的sdk不是4.8.0所导致?

豆子 2013年4月12日 - 09:51

它只是要求 Qt 最低版本是 4.8.0,你的是 4.8.1 显然大于这个版本,不存在这个问题。看问题是没有找到 Qt 的库,你的 Qt 路径是否添加正确?

米米 2013年4月12日 - 08:42

我下的好像是4.8.1

米米 2013年4月12日 - 14:30

Qt 路径是否添加正确是指环境变量里配置的路径吗?

米米 2013年4月12日 - 14:45

刚又检查了一遍。突然发现qmake ../qtcreator.pro “QT_PRIVATE_HEADERS=D:/Develop/QtSDK/Desktop/Qt/4.7.3/mingw/include” 这条命令。。我找我了我的SDK目录下没有mingw目录。只有msvc2010这层目录。

豆子 2013年4月12日 - 14:54

你需要把 QT_PRIVATE_HEADERS 修改成你自己的 Qt 路径。因为这里使用的是 mingw,所以是 mingw 版本的 Qt。如果你没有这个目录,只有 vs2010,说明你安装的是 vs2010 版本的 Qt,是不能使用 mingw 编译的。要么重新安装 mingw 版本的 Qt,并且设置好路径,要么使用 vs2010 编译。

vbuser 2015年9月5日 - 20:49

豆子老师,Qt Creator 自己编译的版本为什么是Debug版的?如何才能编译成Release版本的?

回复
豆子 2015年9月5日 - 21:48

应该是在编译的时候选择了 debug 版本;如果需要 release 版本,在 Project 里面可以选择的。

回复
ye2012 2015年10月21日 - 09:28

豆子老师 我用qt5.5.1 mingw32 编译了qt-creator-opensource-src-3.5.1, 之后补上了缺少的dll,但是又出现了无法定位程序输入点..于动态链接库.. 的错误 这个要怎么解决啊?

回复
ye2012 2015年10月21日 - 10:03

QT 5.5.1的QT_PRIVATE_HEADER的路径是哪个啊?

回复
豆子 2015年10月23日 - 09:09

应该是类似 %QT_PATH%\5.5\Src\qtbase\include\QtSql\5.5.1\QtSql\private 这样的路径

回复
豆子 2015年10月23日 - 09:07

这个错误一般是由于编译版本和运行版本不一致,例如你使用 VC 编译的,但是运行时找到的是 mingw 的(注意检查环境变量)。

回复
ye2012 2015年10月23日 - 09:25

谢谢豆子老师
现在又出现了一个问题:核心载入失败。。。 无法加载库。。。找不到指定的模块 (。。。是两个路径
这又是怎么回事啊??

回复
水手1990 2015年12月14日 - 11:59

你好我现在也是编译完成后,启动时报
核心载入失败,无法加载库,Cored.dll找不到指定的模块

请教下你最后是怎么解决的啊

求助,期待您的回复

回复
水手1990 2015年12月10日 - 17:25

d:\QT\complied\001\qt-creator-2.7.2-src\src\libs\utils\ho
'GetNativeSystemInfo' was not declared in this scope
mingw32-make[4]: *** [debug/hostosinfo.o] Error 1
mingw32-make[4]: Leaving directory `D:/QT/complied/001/bu
mingw32-make[3]: *** [debug] Error 2
mingw32-make[3]: Leaving directory `D:/QT/complied/001/bu
mingw32-make[2]: *** [sub-utils-make_default-ordered] Err
mingw32-make[2]: Leaving directory `D:/QT/complied/001/bu
mingw32-make[1]: *** [sub-libs-make_default-ordered] Erro
mingw32-make[1]: Leaving directory `D:/QT/complied/001/bu
mingw32-make: *** [sub-src-make_default-ordered] Error 2

豆子老师我安装的是QT4.8.4的版本,首次编译源码的时候,出现以上的错误
d:\QT\complied\001\qt-creator-2.7.2-src\src\libs\utils\ho
'GetNativeSystemInfo' was not declared in this scope
但是不知道如何解决,还望多多指点,感激不尽~

回复
水手1990 2015年12月10日 - 17:28

还有就是豆子老师您这讲的都是直接开发QT creator插件,QT creator不是提供了插件开发的集成环境么,但是我新建一个插件工程完成后,直接编译的时候,出现一堆错误,所以想求助,如何在QT creator下直接开发插件呢?期待您的回复,感谢!

回复
豆子 2015年12月14日 - 20:57

这是因为在做这个系列的时候,Qt Creator 还没有提供相应的项目,只能自己编译。现在已经方便多了。

回复
谢启凯 2016年1月16日 - 17:22

豆子老师,请问下 现在我用的Qt 5.5.1(mingw),安装完成之后,Qt Creator已经有了,还需要下源代码重新编译吗?

回复
豆子 2016年1月17日 - 12:02

Windows 平台默认安装的 QtCreator 都是用 VS 编译的,如果你要使用 GCC 编译插件,应该还需要用 GCC 编译一个 debug 版本的 QtCreator

回复
姚远 2016年2月5日 - 15:52

核心载入失败,使用了不兼容的QT库(不能混合使用库的调试版本和发布版本),这个错误是因为什么问题?

回复
豆子 2016年2月22日 - 22:22

可能是编译的 exe 是 debug 版本,但是找到的 Qt dll 是 release 版本的。

回复
atsunlun 2016年6月13日 - 13:33

豆子,可能会有找不到 dll 的错误,如果出现的话请自行修复路径???
是什么意思。我的显示qt creator核心载入失败,无法加载库 找不到指定模块?
我把提示出来的dll都复制进bin文件夹内了,为什么还是不行。编译完全通过。

回复
atsunlun 2016年6月13日 - 15:13

后来参照着安装的2.2.1中的bin文件夹下一个个找,终于找完了。

回复
chengnan5603 2017年5月3日 - 10:43

本地rebuild Qt Creator 4.2.1版源码成功,但启动时有大量的插件启动不起来。请问该如何解决?
错误提示:
---------------------------------------------------------------------------
因为无法载入依赖关系所以无法载入插件: QtSupport(4.2.1)
原因: D:\build-qtcreator-Desktop_Qt_5_8_0_MinGW_32bit-Debug\lib\qtcreator\plugins\QtSupportd4.dll: 无法加载库D:\build-qtcreator-Desktop_Qt_5_8_0_MinGW_32bit-Debug\lib\qtcreator\plugins\QtSupportd4.dll:存储不足,无法处理此命令。

回复
Keke.Cheng 2018年7月26日 - 11:23

我使用QT creator编译,出现
noexcept:未知重写说明符,这个

回复

发表评论

关于我

devbean

devbean

豆子,生于山东,定居南京。毕业于山东大学软件工程专业。软件工程师,主要关注于 Qt、Angular 等界面技术。

主题 Salodad 由 PenciDesign 提供 | 静态文件存储由又拍云存储提供 | 苏ICP备13027999号-2