桌面应用【免费下载链接】PrismLauncherA custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once (Fork of MultiMC)项目地址https://gitcode.com/gh_mirrors/pr/PrismLauncher点击查看免费下载导读本文聚焦 PrismLauncher 仓库中的cmake/vcpkg-triplets目录深入解读这套自定义 vcpkg triplet 的由来、每个配置文件的逐项含义以及它们如何通过 overlay 机制与vcpkg-configuration.json、CMakePresets.json联动实现静态链接第三方库 仅 Release 构建的统一依赖策略。读完本文你将掌握 vcpkg triplet 覆盖机制的核心原理并能对照 PrismLauncher 的实际配置在自己的 CMake vcpkg 项目中复现同样的构建约定。一、背景PrismLauncher 如何用 vcpkg 管理第三方依赖在展开 triplet 之前先看 PrismLauncher 的 vcpkg 依赖管理整体布局。仓库根目录下有三个 vcpkg 相关配置文件vcpkg.json声明项目依赖清单包含ecmhost 工具供find_package(ECM)使用、libqrencode、pkgconf仅 Windows 平台、host 工具、cmark、libarchive显式关闭 default-features仅启用bzip2、lz4、lzma、lzo、zstd特性、tomlplusplus、zlibvcpkg-configuration.json配置 vcpkg 的注册表、overlay 目录与基线版本。其中最关键的是overlay-ports指向./cmake/vcpkg-portsoverlay-triplets指向./cmake/vcpkg-tripletsCMakePresets.json定义各平台 configure/build/test preset其隐藏基座basepreset 通过toolchainFile: cmake/vcpkg/scripts/buildsystems/vcpkg.cmake挂载 vcpkg 的 CMake toolchain并统一开启Launcher_ENABLE_JAVA_DOWNLOADERON与ENABLE_LTOON。也就是说PrismLauncher 的第三方依赖全部由 vcpkg 构建提供而 triplet 正是决定依赖怎么编译的核心策略文件。官方默认 triplet如x64-windows、x64-linux只解决能编译PrismLauncher 则需要一套更贴近发布形态的定制策略——这正是cmake/vcpkg-triplets存在的意义。二、为什么需要自定义 tripletsREADME 的核心意图cmake/vcpkg-triplets/README.md 用一句话说明了这套目录的定位原文直译这些文件用于确保默认 triplets 的-static-release等价物被使用从而避免在 CMakePresets.json 中手动指定它们那里没有获取当前架构的宏或塞进某个随机的 .env 文件中。这句话包含三层关键信息值得逐一拆解目标是 -static-release 等价物vcpkg 社区以-static-release后缀如x64-windows-static-release表示静态链接第三方库 仅 Release 构建的 triplet 变体。PrismLauncher 希望所有平台的默认构建都能自动获得这一行为而不是依赖开发者记住并手动追加后缀。CMakePresets.json 无法表达架构CMake Presets 的cacheVariables是静态键值对没有内置的根据当前主机架构自动展开的宏。如果要在 preset 里写死VCPKG_TARGET_TRIPLETx64-windows-static-release就没办法同时覆盖 x64 与 arm64 两种架构的构建机器反过来如果依赖环境变量又会把 triplet 的选择逻辑散落到.env文件里难以追踪、难以维护。overlay 机制是最终解法vcpkg 允许通过overlay-triplets指定额外目录目录中的 triplet 文件可以同名覆盖vcpkg 内置的默认 triplet。这样x64-windows.cmake会覆盖内置的x64-windowsx64-linux.cmake会覆盖内置的x64-linux以此类推——vcpkg 自动根据主机架构与系统选择对应名称的 triplet无需在 preset 或环境变量中写任何架构相关的内容。三、八个 triplet 文件的逐项解读目录 cmake/vcpkg-triplets 下共有 8 个 triplet 文件覆盖 Linux、macOS、WindowsMSVC 与 MinGW三大平台的 x64 / arm64 架构外加一个用于 macOS 通用二进制的universal-osx。先看总览对照表文件名目标架构CRT 链接库链接系统构建类型特殊项x64-linux.cmakex64dynamicstaticLinuxrelease—arm64-linux.cmakearm64dynamicstaticLinuxrelease—x64-windows.cmakex64dynamicstatic默认 Windowsrelease—arm64-windows.cmakearm64dynamicstatic默认 Windowsrelease—x64-osx.cmakex64dynamicstaticDarwinreleaseVCPKG_OSX_ARCHITECTURESx86_64arm64-osx.cmakearm64dynamicstaticDarwinreleaseVCPKG_OSX_ARCHITECTURESarm64universal-osx.cmakex64名义dynamicstaticDarwin未限定VCPKG_OSX_ARCHITECTURESarm64;x86_64arm64-mingw-static-release.cmakearm64dynamicstaticMinGWreleaseVCPKG_ENV_PASSTHROUGHPATH3.1 通用参数三大构建策略开关除universal-osx与arm64-mingw-static-release外其余文件结构完全一致可抽象为如下模板set(VCPKG_TARGET_ARCHITECTURE x64) # 目标 CPU 架构 set(VCPKG_CRT_LINKAGE dynamic) # C 运行时CRT链接方式 set(VCPKG_LIBRARY_LINKAGE static) # vcpkg 构建的第三方库的链接方式 set(VCPKG_CMAKE_SYSTEM_NAME Linux) # 目标系统跨平台/交叉编译时显式声明 set(VCPKG_BUILD_TYPE release) # 只构建 release 配置各参数作用与取值要点VCPKG_TARGET_ARCHITECTURE目标架构。Windows 侧有效值为x64、arm64等在宿主架构等于目标架构时vcpkg 本可自动推断但显式声明避免了任何歧义。VCPKG_CRT_LINKAGEC 运行时链接方式取dynamic或static。PrismLauncher 全部保持dynamic与顶层 CMakeLists.txt 中 MSVC 前端设置的set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreadedDLL)对应/MD动态运行时严格保持一致确保应用本体与 vcpkg 依赖使用同一套 CRT。VCPKG_LIBRARY_LINKAGE第三方库本身的链接方式取static或dynamic。这里统一为static即所有 vcpkg 依赖以静态库形式链入最终产物——这正是发布版依赖随程序打包的关键避免目标机器缺少动态库。VCPKG_BUILD_TYPErelease表示 vcpkg 只为每个端口构建 Release 配置跳过 Debug 构建显著缩短依赖编译时间、减小buildtrees与installed目录体积。这也是 static-release 中 release 一语的落点。VCPKG_CMAKE_SYSTEM_NAME目标系统名。Linux triplet 写LinuxmacOS triplet 写DarwinMinGW triplet 写MinGW。WindowsMSVC的两个 triplet 未写此变量表示采用 vcpkg 默认的 Windows 语义。3.2 macOS 特有的多架构控制macOS 的 triplet 额外引入了VCPKG_OSX_ARCHITECTURESx64-osx.cmake 声明VCPKG_OSX_ARCHITECTURES x86_64arm64-osx.cmake 声明VCPKG_OSX_ARCHITECTURES arm64universal-osx.cmake 声明VCPKG_OSX_ARCHITECTURES arm64;x86_64并附注释Try to keep in sync with default arm64-osx definition——它名义上VCPKG_TARGET_ARCHITECTURE仍写x64但通过多值架构变量让 vcpkg 同时为 arm64 与 x86_64 各构建一份依赖供 Universal Binary通用二进制链接。该 triplet 未设置VCPKG_BUILD_TYPE因此依赖会构建 Debug 与 Release 两种配置这是它与其余 triplet 的一个显著差异。universal-osx也是唯一一个需要显式指定名称的 triplet由于同时构建两种架构无法通过主机架构自动推断因此必须在 CMakePresets.json 的macos_universalpreset 中用VCPKG_TARGET_TRIPLET: universal-osx显式引用。这一特例恰好反向印证了 README 的判断——能用覆盖机制自动解决的平台单一架构就不该在 preset 里手动写确实无法自动化的场景通用二进制才值得显式声明。3.3 MinGW 交叉编译的额外项arm64-mingw-static-release.cmake 是唯一带-static-release后缀命名的文件也是唯一包含环境透传设置的文件set(VCPKG_TARGET_ARCHITECTURE arm64) set(VCPKG_CRT_LINKAGE dynamic) set(VCPKG_LIBRARY_LINKAGE static) set(VCPKG_ENV_PASSTHROUGH PATH) set(VCPKG_CMAKE_SYSTEM_NAME MinGW) set(VCPKG_BUILD_TYPE release)VCPKG_ENV_PASSTHROUGH PATH允许 vcpkg 构建依赖时把宿主环境的PATH透传给子进程这对 MinGW 工具链尤其重要——交叉编译场景下编译器、链接器、dlltool、windres等工具往往依赖PATH中的特定 MinGW 前缀目录才能被找到。其余参数与通用模板一致。四、覆盖机制如何工作overlay-triplets 与默认 triplet 同名替换理解整套机制的关键在 vcpkg-configuration.json{ default-registry: { kind: git, baseline: 2d6a6cf3ac9a7cc93942c3d289a2f9c661a6f4a7, repository: https://github.com/microsoft/vcpkg }, registries: [ { kind: artifact, location: https://github.com/microsoft/vcpkg-ce-catalog/archive/refs/heads/main.zip, name: microsoft } ], overlay-ports: [./cmake/vcpkg-ports], overlay-triplets: [./cmake/vcpkg-triplets] }工作流程可以概括为vcpkg 根据当前主机架构 当前系统 配置推导出一个默认 triplet 名称例如在 x64 Linux 上推导出x64-linux在 arm64 Windows 上推导出arm64-windowsvcpkg 在查找 triplet 定义时会先查overlay-triplets中列出的目录即./cmake/vcpkg-triplets再回退到内置 triplet由于 PrismLauncher 的 triplet 文件与默认 triplet同名自定义文件即被优先采用——于是每个平台的默认构建自动带上了VCPKG_LIBRARY_LINKAGE static与VCPKG_BUILD_TYPE release这两个策略而 preset 与 CI 环境中不需要出现任何x64/arm64的硬编码。同理overlay-ports指向 cmake/vcpkg-ports其中以vcpkg-tool-meson为代表的自定义 port 会对 vcpkg 内置 port 做同名覆盖或补充与 triplet 覆盖构成端口 三元组双层的构建定制体系。需要说明的是cmake/vcpkg目录在仓库中作为 toolchain 与 port 的载体preset 中toolchainFile指向cmake/vcpkg/scripts/buildsystems/vcpkg.cmake实际内容通常由 vcpkg 仓库以子模块或安装产物方式提供因此本文只依据配置声明说明其用途。五、与 CMake Presets 的联动谁自动、谁显式CMakePresets.json 定义了一个隐藏基座basehidden: true与四个具名 configure presetlinux、macos、macos_universal、windows_mingw、windows_msvc其中前两者与后两者各自带有hostSystemName条件判断保证只在对应平台上激活。linux/macos/windows_mingw/windows_msvc四个 preset均不设置VCPKG_TARGET_TRIPLET——它们完全依赖本文所述的 triplet 覆盖机制由 vcpkg 按主机架构自动解析macos_universal是唯一特例显式追加了两条cacheVariablescacheVariables: { CMAKE_OSX_ARCHITECTURES: x86_64;arm64, VCPKG_TARGET_TRIPLET: universal-osx }CMAKE_OSX_ARCHITECTURES让 CMake 层面同时为两种架构编译VCPKG_TARGET_TRIPLET让 vcpkg 层面使用universal-osx构建两份依赖两者缺一不可。这一自动为主、显式为辅的编排正是 README 所强调的取舍凡是架构可推断的平台就交给 triplet 覆盖自动处理只有 Universal Binary 这类架构不可推断的场景才在 preset 中显式声明。六、从配置到构建如何实际使用与验证6.1 标准构建流程在任意平台Linux / macOS / Windows仓库根目录下直接使用 preset 即可无需关心 tripletcmake --preset linux # 在 Linux 上配置 cmake --build --preset linux # 构建 ctest --preset linux # 运行测试macOS 通用二进制构建则需要cmake --preset macos_universal cmake --build --preset macos_universal配合基座 preset 中的binaryDir: build、generator: Ninja Multi-Config与installDir: install产物会落在仓库根的build/目录中。6.2 验证 triplet 是否生效查看 vcpkg 的安装清单build/vcpkg_installed/目录下应存在当前 triplet 对应的子目录如x64-linux其share与lib中只包含 Release 配置产物配置阶段日志中 vcpkg 会打印实际选用的 triplet 名称可借此确认覆盖是否命中若在配置时显式传入了-DVCPKG_TARGET_TRIPLET...则覆盖机制被绕过——这正是本套设计希望避免的手动指定方式。6.3 在自有项目中复用此模式如需在自建 CMake vcpkg 项目中复刻该策略只需三步新建cmake/vcpkg-triplets/目录为每个目标平台放置同名 triplet 文件内容可参考上文的通用模板在项目根目录的vcpkg-configuration.json中声明overlay-triplets: [./cmake/vcpkg-triplets]保持 CMakePresets.json 不写VCPKG_TARGET_TRIPLET除非确有不可自动推断的多架构场景让 vcpkg 按主机自动选择。七、源码层的呼应triplet 参数在下游构建中的消费triplet 变量并不只是 vcpkg 内部的概念PrismLauncher 自己的 port 也会读取这些变量来调整行为cmake/vcpkg-ports/vcpkg-tool-meson/vcpkg_configure_meson.cmake 中有专门针对VCPKG_BUILD_TYPE的分支判断IF(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL debug)与... STREQUAL release据此决定向 meson 传递的构建类型参数文件注释还提到Allow overrides / additional configuration variables from triplets说明 triplet 中可注入的变量会直接透传给 port 的构建流程cmake/vcpkg-ports/vcpkg-tool-meson/meson.template.in 中通过VCPKG_TARGET_TRIPLET TARGET_TRIPLET将当前 triplet 名称写入生成的 meson 配置文件使 port 内部能感知自己处于哪个 triplet 上下文中。这印证了一个事实PrismLauncher 的cmake/vcpkg-triplets不是孤立的配置文件而是整个构建体系中策略定义的一环——从 triplet 定义策略到 vcpkg 依据策略编译依赖再到自定义 port 读取 triplet 变量调整自身行为构成了完整闭环。理解了这一环也就理解了 PrismLauncher 发布构建中静态链接、仅 Release、跨平台一致的依赖管理全貌。赞分享桌面应用【免费下载链接】PrismLauncherA custom launcher for Minecraft that allows you to easily manage multiple installations of Minecraft at once (Fork of MultiMC)项目地址https://gitcode.com/gh_mirrors/pr/PrismLauncher点击查看免费下载相关推荐静态构建 MumbleStatic Build完整指南基于 vcpkg 的跨平台依赖管理与 CMake 构建实战静态构建 MumbleStatic Build完整指南基于 vcpkg 的跨平台依赖管理与 CMake 构建实战 本篇指南聚焦于如何产出 Mumble 的音视频即时通讯解决跨平台编译难题vcpkg triplet配置全攻略解决跨平台编译难题vcpkg triplet配置全攻略 你是否还在为C/C项目在不同架构和系统间的编译适配而头疼从x86 Windows到ARM64 L包管理器开发工具CLIWinGet 依赖构建的本地化改造vcpkg Overlay Ports 覆盖机制与补丁实践WinGet 依赖构建的本地化改造vcpkg Overlay Ports 覆盖机制与补丁实践 本文以 winget cli 仓库中的 src/VcpkgPor包管理器CLI上一篇如何精准控制Conan多仓库优先级依赖解析顺序的终极指南下一篇Go设计模式性能分析使用pprof分析golang-design-pattern性能瓶颈创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考