简介:Qt Creator 4.11.2 开源源代码包,主要面向需要在龙芯处理器平台上进行源码编译、功能定制或二次开发的 C++/Qt 工程师与学习者,尤其是需要处理平台适配与交叉编译难题的开发者。包内收纳集成开发环境的完整头文件、实现源码、构建脚本与少量文档,共2000个文件,其中头文件995个、C++实现文件900个;另有文本说明与 Markdown 文档辅助阅读,JavaScript 与 Shell 脚本用于构建或工具扩展,少量 C/Python 示例可作参考。压缩包整体约33.57MB,目录组织规范,便于按模块检索阅读。已有209人学习下载,适合深入分析 Qt Creator 的工程模型、调试器集成机制与编辑器扩展框架,也可作为评估大型跨平台 IDE 设计思路的参考。通过源码可以了解 gdb/cdb 调试引擎、FakeVim 模拟器、Git 客户端等关键模块的内部实现;在龙芯平台上编译时,还能对照检查平台相关代码与依赖关系,减少移植适配中的盲点,并理解调试器与 IDE 的协作方式。无论初学者希望借大型项目学习 Qt 架构,还是资深开发者想定制 IDE 功能、完成龙芯环境适配,这套源码都能提供直接可用的一手资料。
1. qt-creator-opensource-src-4.11.2.tar.gz:拿到这个源码包,先别急着解压
qt-creator-opensource-src-4.11.2.tar.gz 是 Qt Creator 4.11.2 的完整开源源码包,不是安装包,也不是补丁集。解压之后你看到的是一个 IDE 的整棵源码树:Core 插件框架、代码编辑器、调试器前端、QML 工具链,以及一套基于 qmake 的构建工程。下载它的人通常带着三类诉求:不想用预编译安装包、想对 IDE 做深度定制、或者想读一个大型 Qt 程序的组织方式。我的建议是解压前先回答两个问题:机器上有没有和目标版本匹配的 Qt?准备用哪个编译器?在这个版本上,环境选错的编译失败率远高于源码本身的问题。下文会从依赖准备讲起,走一遍完整的构建、避坑和最小改动闭环。
2. 构建前置:Qt 版本匹配与依赖清单,90% 的失败发生在这里
2.1 为什么 4.11.2 建议绑 Qt 5.12.x
Qt Creator 4.11 系列发布时正值 Qt 5.12 LTS 生命周期内,它自己的构建系统是 qmake,编译时直接依赖 Qt 的 Core、Gui、Widgets、Network、Xml、Help 等模块,且会隐式依赖这些模块提供的接口行为。如果你拿 Qt 5.9 来编,会在某些插件的链接期看到缺失符号;拿 Qt 5.13、5.14 来编,大概率能过编译,但个别行为差异(比如高 DPI、QColor 的构造方式)会让 IDE 跑起来之后表现怪异的概率上升。所以我的选择很固定:只要编 4.11.x,一律用 Qt 5.12.x,不在这上面追求“新版 Qt 配新 IDE”。
| 目标 Qt 版本 | 常见结果 | 建议 |
|---|---|---|
| Qt 5.6 / 5.9 | Help 模块、部分插件链接缺失,编译期就挂 | 不推荐 |
| Qt 5.12.x | 与 4.11.2 同期,构建平滑,运行稳定 | 推荐 |
| Qt 5.13 / 5.14 | 大体可编,偶发运行时行为差异 | 谨慎使用 |
另外注意,qt-creator-opensource-src 前缀里的 opensource 表示这个包不含商业模块,和 Qt 本身的开源版 / 商业版授权体系不是一回事。开源版 Qt 加上这个源码包,足够构建出完整的 IDE 本体,不需要额外申请任何许可。验证 qmake 是否来自你想要的 Qt,唯一可靠的手段是看它自己的输出:qmake -v,确认版本号指向 5.12.x,而不是系统里另一个残留的旧版本。这一步不花钱,但能省掉后面一整轮排查。
2.2 Debian/Ubuntu 系发行版的依赖清单与安装命令
在 Linux 上构建 4.11.2,系统依赖主要分两类:一类是编译器与 make 工具链,一类是 Qt 平台插件 xcb 在运行期需要的系统库。第一类缺了会直接编译失败;第二类缺了往往编译顺利,但跑./bin/qtcreator的时候报“无法加载 xcb 插件”。下面这条命令覆盖我在 Debian/Ubuntu 系发行版上的常用装配:
sudo apt-get update sudo apt-get install -y build-essential libgl1-mesa-dev \ libx11-xcb-dev libxkbcommon-dev libxcb-cursor-dev \ libxcb-icccm4-dev libxcb-keysyms1-dev libxcb-shape0-dev \ libxcb-xinerama0-dev libxcb-xkb-dev libssl-dev ninja-build命令逻辑:build-essential提供 gcc/g++ 和 make;libgl1-mesa-dev是 Qt 的 OpenGL 支持在构建期需要的头文件;libxcb-*这一串是为 xcb 平台插件准备的各种扩展协议库;libssl-dev让 Qt 5.12 编译出带 SSL 支持的 QNetworkAccessManager,Qt Creator 4.11 的插件更新和在线文档功能会用到它。ninja-build 不是必须的,但后面配合-developer-build做增量编译时,可以让并行度更可控。
参数上补充两点:第一,如果你在容器里构建,装包时加--no-install-recommends,避免把无关的推荐包拖进来占空间。第二,如果发行版是滚动更新型,系统自带 Qt 版本很可能高于 5.12,这时候不要试图用系统的 Qt 来编 Qt Creator,直接建议下载独立的 Qt 5.12.x 安装包放到非系统目录,例如/opt/Qt下。系统 Qt 和源码树里的 Qt 版本一旦混用,编译期经常出现“找不到 Qt5Config.cmake”或“qmake 指向不明”之类的兼容问题,属于最不值得花时间排查的坑。
提示:Windows 上构建 4.11.2 反而比 Linux 简单,用 Qt 官方安装包自带的 MinGW 工具链即可,不需要单独装系统库。下面各章节的命令以 Linux 为准,Windows 用户把
qmake换成 Qt 安装目录下的对应可执行文件即可。
3. 从解压到跑起来:qmake 构建 4.11.2 的最小命令与参数
3.1 最小构建命令:shadow build 与 qmake
拿到源码后,第一步不是解压进家目录直接用,而是建一个独立的构建目录。这样做的原因很直接:Qt Creator 的工程文件里包含大量子工程和插件,构建过程会生成 moc 文件、qrc 文件、.o 文件,如果全部堆在源码目录里,源码树会被污染,以后想换构建目录或重新打包,清理成本极高。常见做法是把源码放在一个只读路径下,构建目录单独开。
mkdir -p ~/qtcreator-build cd ~/qtcreator-build qmake /path/to/qt-creator-opensource-src-4.11.2/qtcreator.pro make -j4这段命令的含义:qmake 读取顶层工程文件 qtcreator.pro,递归生成所有子工程的 Makefile;make -j4 按 4 路并行开始编译。参数上最值得留意的有两个地方。一个是 qmake 的路径,如果你的 PATH 里恰好有多个 qmake,建议直接用绝对路径调用,例如/opt/Qt/5.12.x/gcc_64/bin/qmake,避免指错。另一个是 -j 的取值,不要超过物理核心数的 1.5 倍,否则链接阶段内存会先爆掉,这个问题在第 4 章会单独展开。
如果中间修改过 .pro 文件,或者换过 Qt 版本,最稳妥的做法是重新执行一次 qmake 再 make。很多人在这里图省事直接 make,得到的结果经常是“改了配置但构建系统没感知”。配合make qmake_all也可以全量重生成所有子 Makefile,等价于 qmake -r 的效果。
3.2 用 -developer-build 打开开发循环
如果你只是编译一次然后用,3.1 的命令已经够了。但如果打算反复改源码、编译、运行,我强烈建议从一开始就用 developer-build 模式。这个开关是 Qt Creator 自身工程专门为开发者留的构建选项,效果是把所有产物集中在构建目录内的 bin、lib 子目录,免去安装步骤,直接运行构建目录里的 qtcreator 可执行文件。
cd ~/qtcreator-build qmake -r -developer-build /path/to/qt-creator-opensource-src-4.11.2/qtcreator.pro make -j4这里的-r是递归模式,qtcreator.pro 下面挂了几十个插件子工程,不递归就无法正确生成完整的 Makefile 层级。加-developer-build之后还有两个隐藏收益:一是默认带上调试符号,后面第 6 章自举调试时断点信息完整;二是插件编译产物直接输出到 lib/qtcreator/plugins,增量编译时不需要复制到安装目录,改动生效速度明显更快。
首次全量编译 4.11.2,在 8 核 16GB 内存的机器上通常需要 20 到 40 分钟,取决于磁盘性能。如果你的机器只有 4 核 8GB,建议把并行度调成 2,并做好心理准备,全量构建接近一小时是正常水平。构建期间不要急着干别的内存活,避免链接阶段被系统 OOM 杀掉。
3.3 验证产物:版本号与插件加载情况
构建完成后,第一件事是确认可执行文件能正常启动。最简单的验证是查版本号:
cd ~/qtcreator-build ./bin/qtcreator --version正常输出应该包含 Qt Creator 4.11.2 以及编译时使用的 Qt 版本号。如果输出版本号但启动界面报错,常见原因是平台插件路径不对,这时设置运行时环境变量指向 Qt 安装目录的插件路径。如果是在没有图形界面的服务器上验证启动逻辑,可以加-platform offscreen:
./bin/qtcreator -platform offscreen --versionoffscreen 模式只能验证程序能起来、不闪退,不代表 GUI 交互正常,这点要分清楚。进一步验证可以打开“帮助”菜单里的“已安装插件”页面,检查核心插件是否全部加载成功;如果某个插件加载失败,运行时会有一条红字提示,这是后面排查定制问题的重要入口。
4. 构建避坑:5 个让 4.11.2 编译失败或运行异常的现场
4.1 在源码目录里直接 make,污染源码树
现象:make运行到中途提示 moc 文件重复生成,或者某些 .cpp 报“文件已存在”,再换一个构建目录时旧产物不断干扰新构建。
原因:Qt Creator 4.11 的子工程里,部分生成文件默认会落到源码目录,源码树和构建树混在一起之后,make 的依赖判断完全不可信。这是 shadow build 没有严格执行的典型后果。
解决:先清理污染过的源码树,再强制使用独立构建目录:
find /path/to/qt-creator-opensource-src-4.11.2 -name 'moc_*' -o -name '*.o' -o -name '*.qrc' | xargs rm -f清理完重新走第 3 章的构建命令。我的习惯是给源码目录保持只读权限,从物理上杜绝在源码目录里 make 的冲动。
4.2 qmake 版本指错,编译期大量“找不到 Qt 模块”
现象:前面编译正常,编到某个插件时突然报错cannot find -lQt5Help或者Qt 5.12.0 未找到,甚至报出和预期完全不同的 Qt 版本号。
原因:PATH 里有多个 qmake,调用时命中了旧版本或发行版自带的 qmake,导致整个构建指向了另一套 Qt。Qt Creator 的插件系统对 Qt 版本一致性非常敏感,混用版本会在链接期集中爆发。
解决:全程只用同一个 Qt 的 qmake,并把它的目录放到 PATH 最前面,编译前先核验:
export PATH=/opt/Qt/5.12.x/gcc_64/bin:$PATH qmake -v输出确认为 5.12.x 之后再执行 qmake 和 make。如果之前已经用错误版本生成过 Makefile,必须删掉旧构建目录重新来,光改 PATH 不够。
4.3 链接阶段内存不足,进程被系统杀掉
现象:全量构建进行到最后,终端输出c++: fatal error: killed,或者 ld 进程无征兆消失,dmesg里能看到 OOM 记录。
原因:Qt Creator 主程序加几十个插件同时进入链接阶段,Makefile 的并行策略会把链接任务也并行跑起来,内存峰值很容易超过 8GB。并行度开得越高,峰值越大。
解决:降低并行度,或者把 libs 和可执行文件分开构建:
make -j2如果机器内存只有 8GB,我一般先make -j4 libs,再单独make -j2 bin,两个阶段错开峰值。这个做法能稳定跑完整个构建,只是总时间会略长一点。
4.4 改了源码却不生效,增量构建像黑匣子
现象:修改了某个插件源码,重新 make 之后运行方式没有变化,新代码像没编进去一样。
原因:两种可能。第一,进度条跑到一半就停了,说明 make 认为目标没有变化,通常是 .pro 文件改动后 Makefile 没有重新生成;第二,改的是插件,但运行时加载的还是构建目录里的旧产物,增量构建没有把新产物复制到加载路径。
解决:区分改动类型。改 .cpp 直接 make;改 .pro 先 qmake 再 make。还不行就针对单一子目标构建:
make -C src/plugins/coreplugin -j4这个命令只重建 coreplugin 相关目标,能直观看到编译输出,比全量 make 更容易确认改动是否真的进入了构建。
4.5 运行时报 xcb 插件加载失败
现象:./bin/qtcreator启动时报错could not load the Qt platform plugin "xcb",然后程序退出。
原因:编译期与运行期的 Qt 平台插件路径不一致。常见情况是系统里有两个 Qt,运行时可执行文件找到了一个 Qt 的运行库,但 plugins/platforms 目录下没有对应的 libqxcb.so;另一种情况是构建前没装 xcb 相关 dev 包,导致 xcb 平台插件根本没编出来。
解决:先确认 Qt 的 plugins 目录里存在 libqxcb.so,再显式指定插件路径:
export QT_PLUGIN_PATH=/opt/Qt/5.12.x/gcc_64/plugins ./bin/qtcreator注意,QT_PLUGIN_PATH 只是兜底手段。如果 plugins 目录里根本没有 xcb 插件,直接补装第 2.2 节的依赖包,然后重新构建 Qt 的 xcb 插件,再回来跑 Qt Creator,不要靠环境变量硬撑。
5. 给 4.11.2 加一个菜单项:最小改动与增量编译闭环
5.1 找到入口:Core 插件的 initialize
Qt Creator 4.11 的界面框架全在 src/plugins/coreplugin 下,所有菜单条由 ActionManager 统一管理。最常见的定制方式不是新写一个插件,而是先在 Core 插件的入口挂一个临时 action,把“改源码→增量编译→生效”的闭环跑通,再决定要不要升级成独立插件。下面这段示意代码基于 4.11 系列的 ActionManager 结构,放在 coreplugin 里某个继承自 IPlugin 的类的 initialize() 末尾:
#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/context.h> #include <QAction> #include <QMessageBox> using namespace Core; // 在 initialize() 末尾追加:给 Edit 菜单加一个自定义项 ActionContainer *editMenu = ActionManager::actionContainer(Core::Constants::M_EDIT); QAction *helloAction = new QAction(QStringLiteral("Say Hello"), this); Action *registered = ActionManager::registerAction(helloAction, "Demo.SayHello", Context(Core::Constants::C_GLOBAL)); editMenu->addAction(registered); connect(helloAction, &QAction::triggered, this, []() { QMessageBox::information(nullptr, QStringLiteral("Demo"), QStringLiteral("Hello from 4.11.2")); });代码逻辑里最关键的是 registerAction 这一步。它不只是把 QAction 注册进菜单,还给这个 action 分配了一个全局唯一 ID,让它能进入快捷键系统和状态恢复机制。M_EDIT 是 Core 内部定义的动作容器常量,代表 Edit 菜单;C_GLOBAL 是 global context,意思是这个 action 在任意上下文都可见。类名和常量在 4.11.2 源码里可能略有差异,找不到时用 grep 定位:
grep -rn "M_EDIT" src/plugins/coreplugin/ | head -20确认常量位置后替换即可。这个改动不涉及新工程文件,所以不需要动 .pro,直接增量编译就行。
5.2 增量编译并验证菜单项
改动之后,到构建目录执行针对 coreplugin 的增量构建:
cd ~/qtcreator-build make -C src/plugins/coreplugin -j4 ./bin/qtcreator这段命令只重建 coreplugin 相关目标。第一次编译这个插件会重新运行 moc,输出信息比平时多,之后再次改动就只有真正的编译和链接。启动后打开 Edit 菜单,应该能在顶部或对应分组里看到 “Say Hello”,点击会弹出一个对话框。如果菜单里没出现,先确认代码挂在的是 initialize() 而不是构造函数的末尾,构造函数阶段 ActionManager 的数据结构还没准备好,注册会被静默丢弃。
5.3 三个必调参数:构建类型、递归开关、编译器选择
第一个参数是构建类型。qmake 加CONFIG+=debug再做增量,断点和警告信息完整;不追加的话默认可能按 release 走,两种模式生成的插件目录不同,混用会互相覆盖。我的做法是从第一次构建就确定一种模式,中途不切换。第二个参数是递归开关。手滑改了 qtcreator.pro 后忘了qmake -r,常见后果是新加的头文件没进入 Makefile,编译不报错但行为不生效,这是最容易被误判为源码问题的场景。第三个参数是编译器。想用 clang 编 4.11.2,qmake 传-spec linux-clang,但老版本 clang 对 Qt Creator 4.11 里的 C++17 代码支持较差,建议直接用 gcc,没必要在这里冒险。
6. 进阶技巧:用 Qt Creator 调试 Qt Creator 的断点与日志
如果你的目标不只是加一个菜单项,而是想真正搞懂 4.11.2 的内部逻辑,比如插件加载顺序、项目解析流程、调试器前端的数据流,最直接的办法是自举调试:用一台机器上已经能正常工作的 Qt Creator 打开这份源码,然后把我们编译出来的 bin/qtcreator 作为被调试程序。具体做法是,在这个 IDE 里选择打开工程文件,指向 qt-creator-opensource-src-4.11.2 下的 qtcreator.pro,构建目录选之前建好的 shadow build 目录,然后在 src/plugins/coreplugin/actionmanager/actionmanager.cpp 里打断点,按调试模式启动。因为整个构建都使用同一套 Qt 5.12.x,变量展开、Qt 类型查看都很顺,不会出现跨版本调试时那种数据看不了的情况。
配合自举调试的另一个技巧是日志分类过滤。Qt Creator 内部大量使用 QLoggingCategory 输出运行日志,全量日志刷屏到没法看,但可以用环境变量精确放行某一个分类:
QT_LOGGING_RULES="qtc.core.*.debug=true;qtc.debugger=false" ./bin/qtcreator这条规则的语义是只打开 core 相关的 debug 日志,关掉调试器模块的日志。对 4.11.2 这种日志点埋得比较全的源码,往往能比打断点更快定位插件加载或 action 注册的问题。我自己的习惯是,凡是改了 .pro 结构,改完第一件事不是 make,而是重新 qmake -r;被增量构建坑过一次之后,我在构建目录里固定了一个带绝对路径的 qmake 别名,再也没有遇到过“改了不生效”的玄学问题。希望帮到你。
本文还有配套的精品资源,点击获取