☰
AirPodsDesktop Windows 从源码构建实战指南:CMake 配置、依赖准备与安装包生成
2026/10/15 2:29:14 网站建设 项目流程
  • 桌面应用
  • 智能硬件

【免费下载链接】AirPodsDesktop

☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP)

项目地址:https://gitcode.com/gh_mirrors/ai/AirPodsDesktop
点击查看免费下载

本指南以 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.2C++ 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_TESTSOFF是否构建测试(会连带影响 cpr 依赖是否构建其测试)
APD_ENABLE_CONSOLEOFF是否启用控制台子系统。关闭时 CMakeLists.txt 会为add_executable追加WIN32参数(无控制台窗口);开启时额外定义APD_ENABLE_CONSOLE宏
APD_GENERATE_INSTALLEROFF构建完成后是否调用 CPack 生成 NSIS 安装包
APD_QT_DEPLOYON构建后是否运行 Qt 部署工具windeployqt(仅 MSVC 生效)

此外,CI 中还用到了未出现在文档选项表中的APD_BUILD_GIT_HASH(CMakeLists.txt),传入后可把 git commit 哈希编译进二进制,运行时可通过--trace日志查看,属于持续集成场景下的附加选项。

安装包生成(可选)

开启APD_GENERATE_INSTALLER=ON后,构建系统会:

  1. 通过 CMakeLists.txt 配置 CPack,生成器固定为NSIS,并设置CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL、桌面快捷方式创建/卸载删除等细节;
  2. 安装内容为./Binary目录全量(排除*.ilk、*.exp、*.lib等中间文件),安装目录即程序运行目录;
  3. 构建完成后自动调用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)

项目地址:https://gitcode.com/gh_mirrors/ai/AirPodsDesktop
点击查看免费下载

相关推荐

上一篇:Mac Mouse Fix 终极指南:4 步把十块钱鼠标变出触控板手感
下一篇:Nuclide快速打开性能优化插件:功能评测

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询