- 桌面应用
- 智能硬件
【免费下载链接】AirPodsDesktop
☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP)
本指南以 Docs/Build.md 为主线,系统讲解 AirPodsDesktop(Windows 平台)从源码构建的完整流程:环境依赖准备、CMake 配置参数、编译构建与产物验证,并深入结合仓库中的 CMakeLists.txt、vcpkg.json 与 .github/workflows/windows.yml 等源码与 CI 配置,帮助你理解每一步背后的工程细节,最终在本地产出可运行的AirPodsDesktop.exe与可选的 NSIS 安装包。
构建前置准备
1. 获取源码(含子模块)
AirPodsDesktop 使用git submodule管理部分外部依赖,因此克隆时必须使用--recursive参数,否则子模块目录会为空,导致后续构建缺文件:
git clone --recursive https://github.com/SpriteOvO/AirPodsDesktop.git cd AirPodsDesktop mkdir Build cd Build执行完上述命令后,你当前所在的Build目录即为后续文档中统一称呼的BuildPath,所有后续操作都在该目录下进行。
2. 安装 CMake(>= v3.20)
官方文档要求 CMake 版本>= v3.20。这一点与仓库根目录 CMakeLists.txt 顶部的cmake_minimum_required(VERSION 3.20)严格一致——CMake 版本低于 3.20 时会直接拒绝生成构建系统。
值得注意的是,CMake 3.20.4 之后的行为变化会被项目源码感知:由于 MSVC 的 C++20<format>存在 ABI 问题,CMakeLists.txt 中有一段针对性的兼容处理,将CMAKE_CXX20_STANDARD_COMPILE_OPTION从/std:c++20强制改写为/std:c++latest,以启用实验性的<format>实现。这解释了为什么项目选择了相对较新的 CMake 版本基线。
3. 选择目标平台
官方文档当前仅提供Windows平台的构建说明。虽然项目描述中提到 Linux 支持为 "WIP"(进行中),但 CMakeLists.txt 中与平台相关的代码文件(Bluetooth_win.cpp、GlobalMedia_win.cpp、Resource.rc)均以WIN32条件编译,其余平台分支多标注#error "Need to port.",因此本地构建请以 Windows 为准。
Windows 平台构建环境准备
1. Visual Studio 2019
项目使用Visual Studio 2019作为编译器与生成器后端(CMake 生成器"Visual Studio 16 2019",对应 VS2019 内部版本号 16)。如果你尚未安装,请先安装 Visual Studio 2019,并确保包含C++ 桌面开发工作负载(MSVC 工具链与 Windows SDK)。
2. vcpkg(依赖管理)
AirPodsDesktop 通过 vcpkg.json 声明第三方依赖,构建时以 vcpkg 作为 CMake 工具链。若你尚未安装 vcpkg,请先克隆并执行引导脚本(Windows 下运行bootstrap-vcpkg.bat)。
仓库 vcpkg.json 中声明的依赖包括:
| 依赖 | 版本要求 | 用途 |
|---|---|---|
cpr | >= 1.7.2 | C++ HTTP 客户端(更新检查等) |
cxxopts | - | 命令行参数解析 |
nlohmann-json | - | JSON 解析 |
magic-enum | - | 枚举反射工具 |
boost-pfr | - | 聚合类型反射 |
boost-stacktrace | - | 崩溃堆栈回溯 |
需要说明的是,这些依赖在 CMakeLists.txt 中均采用了"优先查找 vcpkg 安装包、找不到则通过FetchContent在线拉取固定 commit"的双轨策略,因此即便部分依赖未通过 vcpkg 安装,构建系统也能自动从网络获取,容错性较强。
3. Qt 5.15.2
项目 UI 基于Qt 5.15.2构建,通过官方 Qt 安装器安装即可。最小必需组件仅为MSVC 2019 32-bit——这印证了项目采用 32 位(Win32)架构构建的事实。
安装后,有两种方式让 CMake 找到 Qt:
- 将 Qt 安装目录加入
PATH环境变量; - 在稍后的 CMake 配置命令中通过
-DCMAKE_PREFIX_PATH显式指定(详见下文)。
从源码看,CMakeLists.txt 实际需要的 Qt 组件为Core Gui Widgets Svg Multimedia MultimediaWidgets,并额外要求Qt5LinguistTools(用于翻译文件编译),安装时可一并确认这些模块存在。
4. NSIS(可选)
如果需要生成 Windows 安装包(.exe安装程序),需额外安装NSIS。官方文档明确说明:如果不生成安装程序,则无需安装。对应地,CMakeLists.txt 中只有在APD_GENERATE_INSTALLER选项开启时,才会引入CPack+ NSIS 生成流程。
构建命令详解
打开PowerShell,进入 BuildPath,按需修改下列参数后执行:
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_BUILD_TYPE=<Debug|RelWithDebInfo> -DCMAKE_TOOLCHAIN_FILE=path\to\vcpkg\scripts\buildsystems\vcpkg.cmake ../ cmake --build . --config <Debug|RelWithDebInfo> ls ./Binary第一条命令:CMake 配置(Generate)
逐参数拆解如下:
| 参数 | 含义 |
|---|---|
-G "Visual Studio 16 2019" | 指定生成器为 VS2019 的 Visual Studio 工程 |
-A Win32 | 目标架构为 32 位(Win32) |
-DCMAKE_BUILD_TYPE=<Debug\|RelWithDebInfo> | 指定构建类型,仅 Debug 或 RelWithDebInfo 二选一 |
-DCMAKE_TOOLCHAIN_FILE=path\to\vcpkg\scripts\buildsystems\vcpkg.cmake | 启用 vcpkg 工具链,让 CMake 自动从 vcpkg 查找依赖 |
../ | 指向源码根目录(即 AirPodsDesktop 仓库根目录) |
关于CMAKE_PREFIX_PATH:如果你没有把 Qt 目录加入PATH环境变量,则必须在第一条命令中追加该选项,写法如下:
-DCMAKE_PREFIX_PATH=path\to\Qt\5.15.2\msvc2019这是文档给出的官方写法,注意目录层级精确到msvc2019(对应 32 位 MSVC 构建的 Qt 库)。CI 工作流 .github/workflows/windows.yml 中给出的等价写法是:
cmake -G "Visual Studio 16 2019" ^ -A Win32 ^ -DCMAKE_BUILD_TYPE=RelWithDebInfo ^ -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake ^ -DCMAKE_PREFIX_PATH=<workspace>/Build/AirPodsDesktop-Deps/Qt/5.15.2/msvc2019 ^ -DAPD_GENERATE_INSTALLER=ON ^ -DAPD_BUILD_GIT_HASH=<commit-sha> ^ ../../可见 CI 使用的是RelWithDebInfo(发布 + 调试信息)配置,并额外启用了安装包生成与 Git 哈希注入,可作为你验证本地配置是否正确的对照样本。
第二条命令:编译构建(Build)
cmake --build . --config <Debug|RelWithDebInfo>--config指定的构建类型必须与配置阶段-DCMAKE_BUILD_TYPE保持一致。构建产物统一输出到./Binary目录——这是 CMakeLists.txt 中通过遍历所有CMAKE_*_OUTPUT_DIRECTORY变量强制重定向的结果,无论 Debug 还是 RelWithDebInfo 配置,可执行文件都落在同一处。
第三条命令:验证产物
ls ./Binary构建成功后,你应能在./Binary下看到AirPodsDesktop.exe。若开启了APD_QT_DEPLOY(默认开启),构建完成时 CMakeLists.txt 注册的 POST-BUILD 命令会自动调用 Qt 的windeployqt将运行所需的 Qt DLL 拷贝到同一目录,因此该目录已是可移植运行的完整程序目录。
更多 CMake 构建选项(Build options)
官方文档在结尾提示查看 CMakeLists.txt 的Build options小节(见 CMakeLists.txt)。该小节定义了 4 个可选的布尔开关,全部默认关闭,均通过-D<选项>=ON的方式开启:
| 选项 | 默认值 | 作用 |
|---|---|---|
APD_BUILD_TESTS | OFF | 是否构建测试(会连带影响 cpr 依赖是否构建其测试) |
APD_ENABLE_CONSOLE | OFF | 是否启用控制台子系统。关闭时 CMakeLists.txt 会为add_executable追加WIN32参数(无控制台窗口);开启时额外定义APD_ENABLE_CONSOLE宏 |
APD_GENERATE_INSTALLER | OFF | 构建完成后是否调用 CPack 生成 NSIS 安装包 |
APD_QT_DEPLOY | ON | 构建后是否运行 Qt 部署工具windeployqt(仅 MSVC 生效) |
此外,CI 中还用到了未出现在文档选项表中的APD_BUILD_GIT_HASH(CMakeLists.txt),传入后可把 git commit 哈希编译进二进制,运行时可通过--trace日志查看,属于持续集成场景下的附加选项。
安装包生成(可选)
开启APD_GENERATE_INSTALLER=ON后,构建系统会:
- 通过 CMakeLists.txt 配置 CPack,生成器固定为
NSIS,并设置CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL、桌面快捷方式创建/卸载删除等细节; - 安装内容为
./Binary目录全量(排除*.ilk、*.exp、*.lib等中间文件),安装目录即程序运行目录; - 构建完成后自动调用
cpack -C <配置>生成安装程序,输出到./Installer目录。
注意 CPack 的CPACK_SYSTEM_NAME变量总是被引入(CMakeLists.txt),并最终写入生成的 Source/Config.h(模板文件为 Source/Config.h.in),因此即使不生成安装包,该宏也始终存在。
从源码理解构建产物的完整生命周期
编译标准与工程配置
CMakeLists.txt 将语言标准锁定为C++20(CMAKE_CXX_STANDARD 20,REQUIRED),并启用了 Qt 的自动化工具链:CMAKE_AUTOMOC(moc)、CMAKE_AUTORCC(rcc 编译.qrc资源)、CMAKE_AUTOUIC(uic 编译.ui)。这意味着 Qt 信号槽、Q_OBJECT类、UI 文件与资源文件均由 CMake 自动处理,不需要手工维护 moc/uic 输出。
MSVC 下还附加了/MP(多进程并行编译)与/await(启用协程支持,兼容 cppwinrt 依赖)等编译选项(CMakeLists.txt)。
翻译资源:构建的隐藏环节
项目内置 7 种语言翻译(de_DE fr_FR ja_JP ko_KR ru_RU zh_CN zh_TW,见 CMakeLists.txt),对应仓库 Source/Resource/Translation 目录下的apd_*.ts文件。构建时:
- 自定义目标
APD_CREATE_UPDATE_TS会调用 Qt 的lupdate递归扫描Source/自动更新.ts文件; qt5_add_translation将.ts编译为.qm,输出到./Binary/translations/目录;- 运行时 Application.cpp 会从可执行文件旁的
translations子目录动态加载apd_<locale>_<COUNTRY>.qm。
这解释了为何Binary目录下会有translations子目录——程序多语言能力完全依赖构建阶段的这条翻译管线,属于构建流程不可分割的一部分。
从入口到日志:构建后如何验证程序行为
入口 Main.cpp 依次执行:挂接父进程控制台 → 单实例互斥锁检查 → 应用初始化与Prepare→ 事件循环。其中:
- 单实例检查:基于命名互斥体(
Global\<name>_InstanceMutex),详见 Utils.h,重复启动的实例会直接退出; - 日志输出:spdlog 同时写文件与控制台,日志文件位于工作目录下的
AirPodsDesktop.log,由 Logger.cpp 定义。启动时若带--trace参数会输出全量 trace 级日志,便于排查构建后运行问题(命令行选项由 Opts.cpp 通过 cxxopts 解析,支持--help、--trace、--print-all-locales)。
因此,在Binary目录直接运行AirPodsDesktop.exe若出现异常,优先查看同目录日志文件即可定位到具体模块。
常见问题与排错指引
- CMake 版本过低:报错提示
CMake 3.20 or higher is required。请升级 CMake(CI 中固定使用 3.21.4,见 .github/workflows/windows.yml)。 - 找不到 Qt:配置阶段报
Could not find a package configuration file provided by "Qt5"。请确认已安装 Qt 5.15.2 且 MSVC 2019 32-bit 组件齐全,并正确传入-DCMAKE_PREFIX_PATH=...\Qt\5.15.2\msvc2019。 - vcpkg 依赖拉取失败:可先单独运行
.\vcpkg install安装 vcpkg.json 声明的依赖;若网络不佳,依赖也会走FetchContent在线拉取,同样需要网络可达。 - 构建类型不一致:配置阶段
-DCMAKE_BUILD_TYPE与构建阶段--config必须一致(Debug 或 RelWithDebInfo 二选一),否则可能出现链接产物缺失。 - 产物目录为空:构建输出统一重定向到
./Binary,请勿在其他子目录寻找 exe;若开启了安装包生成,安装程序位于./Installer目录。 - 无法重复启动程序:这是单实例机制的正常表现,并非构建问题。
结语
AirPodsDesktop 的构建链路并不复杂,但环环相扣:vcpkg 提供第三方依赖、Qt 提供 UI 与翻译工具链、CMake 统一完成 C++20 编译、资源编译、Qt 部署与 NSIS 打包。掌握本文介绍的构建命令与选项后,你不仅能顺利产出可运行的 Windows 程序与安装包,还能借助 CMakeLists.txt 与 .github/workflows/windows.yml 中留存的工程细节,按需定制属于自己的构建配置。
- 桌面应用
- 智能硬件
【免费下载链接】AirPodsDesktop
☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP)
相关推荐
Sigil 在 Windows 上从源码构建完整指南:依赖准备、CMake 配置与 Inno Setup 安装包生成
Sigil 在 Windows 上从源码构建完整指南:依赖准备、CMake 配置与 Inno Setup 安装包生成 导读 本指南以 Sigil 官方《Buil
桌面应用文档5 分钟看懂 Strix:AI 安全测试如何让漏洞在你眼前现形
5 分钟看懂 Strix:AI 安全测试如何让漏洞在你眼前现形 接手一个跑了三年的老项目,或者准备上线一个刚写完的 API,你有没有过这种纠结:请一次渗透测试报
模型编译深度学习推理引擎ethminer 从源码构建指南:跨平台依赖准备、CMake 配置与编译实战
ethminer 从源码构建指南:跨平台依赖准备、CMake 配置与编译实战 本文是一份基于 ethminer(支持 OpenCL、CUDA 与 Stratum
区块链
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考