news 2026/9/7 3:20:47

Ladybird 浏览器:Qt Creator 项目配置实战——从工程导入到 clang-format 自动格式化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ladybird 浏览器:Qt Creator 项目配置实战——从工程导入到 clang-format 自动格式化

Ladybird 浏览器:Qt Creator 项目配置实战——从工程导入到 clang-format 自动格式化

【免费下载链接】ladybirdTruly independent web browser项目地址: https://gitcode.com/GitHub_Trending/la/ladybird

本文基于 Ladybird 官方文档 QtCreatorConfiguration.md,系统讲解如何把 Ladybird 这个以 CMake 管理的大型 C++ 浏览器工程导入 Qt Creator 并配置为可日常开发的工作区:包括通过Import Existing Project重建文件清单、编辑.config/.cxxflags/.includes三个工程文件、用 Beautifier 插件接入项目级.clang-format规则,以及配置输入lic即可插入版权声明的 License 模板。读完本文,你可以在 Qt Creator 中获得与 Ladybird 代码风格一致的补全、跳转与自动格式化能力。

一、前置条件:先确保命令行构建链路可用

在配置 Qt Creator 之前,文档明确要求:先拥有一个可用的工具链,并且能够用命令行完成 Ladybird 的构建与运行。构建步骤请参考 BuildInstructionsLadybird.md。

原因很直接:后文要向工程里添加Build/release/等生成目录作为头文件搜索路径,这些目录只有在真正执行过一次 CMake 构建之后才存在;同时 Ladybird 依赖 vcpkg 管理的第三方库(如 Skia),其头文件位于构建目录下,只有完成构建,IDE 的索引与跳转才有意义。

Qt Creator 本身不需要安装整套 Qt SDK——从 Qt 官网下载离线安装器后,在组件列表左侧只勾选 "Qt Creator" 即可,这只是一步纯 IDE 的安装,不引入额外的 Qt 框架依赖。

二、导入工程:Import Existing Project 与文件清单重建

按官方文档的操作序列,在 Qt Creator 中完成导入:

  1. 打开 Qt Creator,选择File -> New File or Project...
  2. 选择Import Existing Project
  3. 给工程起一个名字(注意:部分工具默认假设小写的ladybird),并将目录定位到你的 Ladybird 仓库检出根目录,点击 Next;
  4. 等待文件列表生成,可能需要一两分钟
  5. 忽略 Qt Creator 自动生成的文件列表——它并不完整,后文会覆盖;
  6. Add to version control设为<None>,点击 Finish。

2.1 为什么要手动重新生成 ladybird.files

导入完成后,官方要求回到 shell 中进入 Ladybird 工程目录,执行 refresh-ladybird-qtcreator.sh 脚本来重新生成根目录下的ladybird.files清单文件,并且此后每次删除或新增文件都要重新执行一次

阅读该脚本源码可以理解它做了什么:

find . \( \ -name Base \ -o -name Patches \ -o -name Ports \ -o -name Root \ -o -name Build \ \) -prune \ -o \( \ -name '*.ipc' \ -o -name '*.cpp' \ -o -name '*.idl' \ -o -name '*.c' \ -o -name '*.h' \ -o -name '*.in' \ -o -name '*.css' \ -o -name '*.cmake' \ -o -name '*.json' \ -o -name 'CMakeLists.txt' \ \) \ -print > ladybird.files find Build/release/ \( \ -name '*.cpp' \ -o -name '*.idl' \ -o -name '*.h' \ \) \ -print >> ladybird.files

从源码结构看,脚本分两段工作:

  • 第一段find遍历仓库(未设置LADYBIRD_SOURCE_DIR时用git rev-parse --show-toplevel自动定位),剪枝跳过BasePatchesPortsRootBuild这几个与开发无关或体积巨大的目录,只收录源码相关的扩展名——*.ipc*.cpp*.idl*.c*.h*.in*.css*.cmake*.jsonCMakeLists.txt
  • 第二段find专门把Build/release/下的生成文件(*.cpp*.idl*.h)追加到清单末尾。Ladybird 通过 CMake 代码生成器(例如从.idl/.ipc定义生成的 C++ 代码)产出大量源文件,这些文件是 IDE 补全和跳转所必需的,因此单独追加。

注意清单中特意包含了*.ipc*.idl——这两类是 Ladybird 的接口/IPC 定义文件,后续还会在自动格式化一节中专门处理。

2.2 编辑 ladybird.config:加入编译期格式检查宏

用 Qt Creator 的跨文件搜索打开ladybird.config(快捷键 ^K,macOS 上为 CMD+K,输入文件名后回车即可打开),在其中追加:

#define ENABLE_COMPILETIME_FORMAT_CHECK

该宏作用于 Ladybird 的格式化库 AK/Format.h:Ladybird 的fmt::format/DebugStringf等格式化接口支持在编译期对格式串与参数类型做一致性检查,开启此宏后,格式化字符串写错(占位符与参数类型不匹配)会在编译阶段直接报错,而不是留到运行时才暴露。在 IDE 的日常开发中提前打开它,能显著减少此类低级错误。

2.3 编辑 ladybird.cxxflags:对齐项目的编译标准

ladybird.cxxflags的内容改为:

-std=c++23 -fsigned-char -fconcepts -fno-exceptions -fno-semantic-interposition -fPIC

这些是 Ladybird 实际构建所使用的关键编译选项,让 IDE 的语义分析与真实构建保持一致:

  • -std=c++23:Ladybird 是 C++23 工程;
  • -fsigned-char:规定char默认有符号,保证跨平台行为一致;
  • -fconcepts:启用 C++20/23 的 concepts 语法(GCC 的显式开关);
  • -fno-exceptions:整个工程不使用异常,错误处理走Error/Result等显式类型(可参考 AK/Error.h、AK/Result.h);
  • -fno-semantic-interposition:禁止语义插桩,保证内联与链接行为可预期;
  • -fPIC:生成位置无关代码。

2.4 编辑 ladybird.includes:补齐头文件搜索路径

ladybird.includes改为如下内容(Skia 路径需按你本地Build/release/vcpkg_installed的实际架构目录调整):

./ Libraries/ Services/ Build/release/ Build/release/Libraries/ Build/release/Services/ Build/release/vcpkg_installed/x64-linux/include/skia/ AK/

各路径的用途:

  • Libraries/Services/AK/:Ladybird 的三大源码区——基础库(Libraries/LibCoreLibraries/LibWeb等)、多进程服务(Services/RequestServerServices/WebContent等)以及基础工具库AK(字符串、容器、格式化等);
  • Build/release/及其子目录:放置 CMake 代码生成器输出的头文件/源码,IDE 索引这些生成物是跨模块跳转的前提;
  • Build/release/vcpkg_installed/x64-linux/include/skia/:vcpkg 拉取的 Skia 2D 图形库头文件,供 LibGfx 等渲染相关代码补全使用。

2.5 收尾:处理 UTF-8 BOM

最后,在 Qt Creator 的选项中搜索 "BOM"(路径:Text Editor > Behavior > File Encodings > UTF-8 BOM),把行为切换为 "Always delete"(始终删除 BOM),避免保存时给源文件注入 BOM 污染 Ladybird 的代码库。

至此 Qt Creator 的工程配置完成,可以开始浏览工程、修改代码了。

三、自动格式化:接入项目级 .clang-format 规则

Ladybird 的低层代码风格(空格、括号、大括号位置等)统一由仓库根目录的 .clang-format 定义,整体规则参见 CodingStyle.md。在配置自动化之前,文档特别提醒:先确认你本地的 clang-format 版本与项目要求一致,因为部分操作系统默认携带的版本不同。

从源码看,CI 强制的版本由 Meta/Linters/lint_clang_format.py 决定:

CLANG_FORMAT_MAJOR_VERSION = 21

即 clang-format21。如果发行版自带的版本太旧,需要单独安装新版,相关方法见 AdvancedBuildInstructions.md 中 "clang-format updates" 一节。

.clang-format本身以BasedOnStyle: WebKit为基底并做了大量定制(AlignTrailingComments: AlwaysAfterFunction: true的大括号换行、IndentPPDirectives: AfterHashRemoveSemicolon: true等),文件末尾还带有一段Language: ObjC的独立配置段,用于 macOS 上的.mm源文件。

3.1 启用 Beautifier 插件并注入自定义规则

按文档步骤在 Qt Creator 中配置:

  1. 菜单Help > About Plugins...
  2. 找到Beautifier (experimental)一行(在搜索框输入beau可以快速定位);
  3. 勾选其复选框;如被提示,重启 Qt Creator;
  4. 菜单Tools > Options...
  5. 在搜索框输入 "beau",进入Beautifier > Clang Format
  6. 选择 "customized" 风格,点击 "edit";
  7. .clang-format文件的完整内容粘贴进 "value" 框,点击 "OK";
  8. 切到Beautifier > General页,勾选 "Enable auto format on file save";
  9. 确认工具选中的是 "ClangFormat",点击 "OK"。

文档还给出两条务实的注意事项:

  • Ladybird 并非整个代码库都已通过 clang-format 清理,因此保存文件时偶尔会出现大面积 diff。作者建议自行判断:只有几行的话直接带上没问题;如果整文件都被重排,更好的做法是单独提交一次格式化,或者直接忽略这些格式改动。可以顺便学习git add -p(按块暂存)与git checkout -p(按块回退)的用法;
  • IPC 定义文件会被误格式化:Qt Creator 倾向把.ipc文件当作 C++ 头文件并尝试格式化,这没有意义。解决办法是告诉 Qt Creator 这些文件是纯文本:
    1. 菜单Tools > Options...
    2. 搜索框输入 "beau",进入Environment > MIME Types
    3. 在小的搜索框中输入 "plain",选中text/plain
    4. 在 "details" 区可见 Patterns 列表(形如*.txt;*.asc;*,v),将其扩展为*.txt;*.asc;*,v;*.ipc;*.gml
    5. 点击 "OK" 关闭对话框;
    6. 可能需要把已打开的 IPC 文件关掉再重新打开。验证方式:右键编辑器页签中的文件名,选择 "Properties...",第三行应显示MIME type: text/plain

四、License 模板:输入 lic 自动插入版权声明

Ladybird 的源码文件统一以如下版权头开头:

/* * Copyright (c) 2024-present, the Ladybird developers. * * SPDX-License-Identifier: BSD-2-Clause */

文档演示的用法是:新建任意位置的一个文件(例如license-template.creator),把上面的标准许可证模板写入其中,然后在 Qt Creator 中:

  1. 打开菜单Tools->Options,找到C++区域;
  2. 切到 "File Naming" 标签页(文档作者吐槽了一句"不要问它为什么在这里");
  3. 页面底部有 "License template:" 选项,点击 "Browse…" 选中刚才的license-template.creator文件;
  4. 点击 "OK" 完成配置。

配置完成后,在 C++ 文件开头输入lic即可自动展开出完整的版权声明,配合第三节的保存时自动格式化,新文件从版权头到代码风格都与 Ladybird 代码库保持一致。

五、小结

本文覆盖的完整工作流可以归纳为四步:

  1. 导入Import Existing Project导入仓库根目录,用 Meta/refresh-ladybird-qtcreator.sh 重建ladybird.files(新增/删除文件后需重跑);
  2. 三文件对齐ladybird.configENABLE_COMPILETIME_FORMAT_CHECKladybird.cxxflags设为-std=c++23 -fsigned-char -fconcepts -fno-exceptions -fno-semantic-interposition -fPICladybird.includes列出源码区、Build/release生成目录与 Skia 头文件路径;
  3. 格式化:确认 clang-format 21 后,用 Beautifier 插件注入根目录.clang-format规则,开启保存时自动格式化,并把*.ipc*.gml归入text/plain以免被误格式化;
  4. 版权头:通过 C++ > File Naming 的 License template 配置lic快捷模板。

这套配置让 Qt Creator 的索引、补全与格式化行为与 Ladybird 的 CMake 构建和 CI 风格检查(Meta/Linters/lint_clang_format.py)保持一致;其他编辑器(VS Code、CLion、Neovim 等)的配置可参考同目录下的 EditorConfiguration 系列文档。

【免费下载链接】ladybirdTruly independent web browser项目地址: https://gitcode.com/GitHub_Trending/la/ladybird

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 3:20:03

蓝牙文件传输全攻略:从系统操作到开发调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 3:19:43

GeoLibre轻量级WebGIS部署实战:从入门到接口调用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 3:17:16

ARM CMSIS-5深度解析:从Core到DSP/RTOS的嵌入式标准化架构

ARM-CMSIS-5在嵌入式圈子里其实是个"天天见但未必看清全貌"的东西。你打开Keil MDK新建一个STM32工程&#xff0c;工具链自动帮你勾选CMSIS Core&#xff0c;编译器自动找到core_cm4.h和system_stm32f4xx.c&#xff0c;一切顺理成章&#xff0c;以至于很少有人停下来…

作者头像 李华
网站建设 2026/9/7 3:16:42

外景古风道观场景搭建全流程:从选址到做旧的一线经验

做外景古风道观场景这事儿&#xff0c;我在这个行当里摸爬滚打也有十来年了&#xff0c;每次接到这类活还是会有点小兴奋。道观和宫殿完全是两码事&#xff0c;宫殿讲究的是威压和排场&#xff0c;道观要的却是仙气和隐逸——它得藏在山野之间&#xff0c;要有雾气、有青苔、有…

作者头像 李华
网站建设 2026/9/7 3:15:23

Claude Code插件包工程化:团队配置管理与一键分发实践

最近不少团队都在折腾 Claude Code&#xff0c;插件越攒越多&#xff0c;从顺手写几个 slash command&#xff0c;到塞满几十个 MCP 和 Skills&#xff0c;最后发现每个人本地的 ~/.claude 目录结构都不一样&#xff0c;换台机器就废&#xff0c;新人入职配置半天。标题里说的…

作者头像 李华