尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
CMake CPack WIX Generator 完全指南:用 WiX Toolset 构建 Windows Installer(.msi)安装包
构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载导读本文以 CMake 官方文档 Help/cpack_gen/wix.rst 为骨架系统讲解 CPack 的WIX生成器如何调用 WiX Toolset 产出 Windows Installer.msi数据库涵盖两种工具链WiX .NET Tools v4 与 WiX Toolset v3的环境准备、全部CPACK_WIX_*配置变量的含义与默认行为、自定义模板与补丁注入等高级玩法。读完本文你将能在一份CMakeLists.txt中直接配置出带组件选择、快捷方式、许可协议、自定义 UI 与注册表信息的专业 MSI 安装程序并理解生成器底层Source/CPack/WiX/cmCPackWIXGenerator.cxx的关键调用链。一、WIX 生成器是什么CPack 的WIX生成器使用 WiX ToolsetWindows Installer XML Toolset来生成 Windows Installer 数据库文件即常见的.msi安装包。在配置阶段通过-G WIX指定生成器打包阶段由 CPack 自动调用 WiX 工具完成编译与链接。与 NSIS 等自解压安装程序不同MSI 走的是 Windows 系统级安装服务Windows Installer Service通道因此天然支持添加/删除程序管理、静默安装msiexec /i、按用户或按机器安装per-user / per-machine等能力适合企业级软件分发。从源码结构看整个生成器位于 Source/CPack/WiX 目录核心类cmCPackWIXGenerator继承自cmCPackGeneratorcmCPackWIXGenerator.h它对外输出扩展名为.msiGetOutputExtension()返回.msi支持组件化安装SupportsComponentInstallation()返回true。二、选择 WiX 工具链CPACK_WIX_VERSIONCPack 依据CPACK_WIX_VERSION变量在两类 WiX 工具链之间做出选择4使用WiX .NET Tools即 v4 工具链命令为wix。3使用WiX Toolset v3命令为candlelight。这是默认值。该变量在 Modules/Internal/CPack/CPackWIX.cmake 中直接决定工具查找与InstallScope默认值在生成器实现中InitializeWiXConfiguration() 会解析该值任何非 3/4 的取值都会以 CPACK_WIX_VERSION has unknown value 报错。2.1 WiX .NET Toolsv4打包流程由单一命令wix build完成把 WiX 源文件直接构建为.msi数据库。该命令的调用可通过两类工具专属变量定制CPACK_WIX_BUILD_EXTENSIONS见CPACK_WIX_TOOL_EXTENSIONSCPACK_WIX_BUILD_EXTRA_FLAGS见CPACK_WIX_TOOL_EXTRA_FLAGSv4 的 WiX 扩展必须按WixToolset.Name.wixext形式命名。CPack 期望wix.NET 工具可直接命令行调用且所需扩展已预先安装同时要求wix版本与CPACK_WIX_VERSION兼容扩展版本与wix工具版本一致。安装步骤Windowsbat 命令用dotnet安装wix命令行工具。全局安装到当前用户dotnet tool install --global wix --version 4.0.4这会生成%USERPROFILE%\.dotnet\tools\wix.exe并把该目录加入当前用户的PATH。或安装到指定路径例如c:\WiXdotnet tool install --tool-path c:\WiX wix --version 4.0.4此时wix.exe位于c:\WiX但不会自动加入PATH。可以设置WIX环境变量告知 CPack 工具位置例如set WIXc:\WiX。添加 CPack 默认 WiX 模板所需的UI扩展wix extension add --global WixToolset.UI.wixext/4.0.4全局添加的扩展存放在%USERPROFILE%\.wix若设置了WIX_EXTENSIONS环境变量则存放在%WIX_EXTENSIONS%\.wix。2.2 WiX Toolset v3打包流程分为两步candle把.wxs源文件编译为.wixobj中间对象文件。可用CPACK_WIX_CANDLE_EXTENSIONS与CPACK_WIX_CANDLE_EXTRA_FLAGS定制。light把.wixobj链接为最终的.msi数据库。可用CPACK_WIX_LIGHT_EXTENSIONS与CPACK_WIX_LIGHT_EXTRA_FLAGS定制。CPack 会按需先后调用两个工具中间的.wixobj属于实现细节打包目录_CPack_Packages下可看到。v3 的扩展必须按WixNameExtension形式命名。v3 工具通过PATH查找若设置了WIX环境变量则 CPack 在%WIX%与%WIX%\bin下查找。这一查找逻辑可见 CPackWIX.cmakev4 只查找wix可执行文件v3 则查找candle与light两个可执行文件找不到即FATAL_ERROR。从源码看两种工具链的实际调用命令形态v4 路径 PackageWithWix()wix build -arch arch -out msi -ext ext... -culture culture... -src wxs...v3 路径 PackageWithWix3()先对每个源文件执行 RunCandleCommand()candle -nologo -arch arch -out wixobj -ext ext...再执行 RunLightCommand()light -nologo -out msi -ext ext... -cultures:...。三、CPack WIX 专属配置变量详解以下变量专门针对使用 WiX 构建的 Windows 安装程序配置于CMakeLists.txt或CPACK_PROJECT_CONFIG_FILE中。3.1 版本与 GUID升级与产品标识CPACK_WIX_VERSION自 3.30 起指定配置面向的 WiX Toolset 版本取值为4或3默认3。如前所述它决定了工具链与后续若干变量的默认行为。CPACK_WIX_UPGRADE_GUID升级 GUID对应 WiX 中的Product/UpgradeCode。未显式设置时由 CPack 自动生成。建议显式设置为一个固定的全局唯一 GUID这样后续版本的安装包可以替换掉使用同一 GUID 的旧安装。你可以在首次打包后把 CPack 自动生成的值回填到 CMakeLists.txt 中固化下来。不要使用他人或他项目生成的 GUID。GUID 语法为固定长度格式XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX每个 X 为大写十六进制数字CPACK_WIX_PRODUCT_GUID产品 GUID对应Product/Id。未显式设置时自动生成。显式设置后决定安装器的 Product Id如果检测到已有使用同一 GUID 的安装安装器会中止。语法与CPACK_WIX_UPGRADE_GUID相同。源码佐证在 InitializeWiXConfiguration() 中未设置的两个 GUID 均由 GenerateGUID() 生成——Windows 上调用UuidCreate非 Windows 平台使用uuid_generate。其中CPACK_WIX_UPGRADE_GUID自动生成时会给出 WARNING提醒用户最好显式固化。两个 GUID 随后被写入cpack_variables.wxi供默认模板引用见 CreateWiXVariablesIncludeFile() 与 WIX.template.in。3.2 许可协议与品牌元素CPACK_WIX_LICENSE_RTFRTF 许可协议文件。行为规则若CPACK_RESOURCE_FILE_LICENSE是.rtf扩展名则原样使用若为.txt扩展名WIX 生成器会隐式转换为 RTF源文件编码需为UTF-8当CPACK_RESOURCE_FILE_LICENSE是不受支持的格式、或.txt → .rtf转换不符合预期时可用此变量直接覆盖。转换由cmWIXRichTextFormatWritercmWIXRichTextFormatWriter.cxx实现CreateLicenseFile() 中.rtf直接拷贝.txt逐行写入 RTF其他扩展名直接报错。模板中通过WixVariable IdWixUILicenseRtf引用WIX-v3/WIX.template.in。CPACK_WIX_PRODUCT_ICON显示在添加或删除程序中程序名旁边的图标。设置后将替换默认图标。对应模板中的ARPPRODUCTICON属性与Icon元素。CPACK_WIX_UI_BANNER除欢迎页与完成页外所有安装页顶部显示的位图。设置后替换默认横幅。图片尺寸必须为 493 × 58 像素。CPACK_WIX_UI_DIALOG欢迎页与完成页的背景位图。设置后替换默认对话框图像。图片尺寸必须为 493 × 312 像素。3.3 界面与快捷方式CPACK_WIX_UI_REF指定 WiXUI扩展的对话框集合v4 下是默认模板中ui:WixUI元素的 Idv3 下是默认模板中UIRef元素的 Id。默认值未定义任何 CPack 组件时为WixUI_InstallDir定义了组件时为WixUI_FeatureTree源码见 InitializeWiXConfiguration()。默认模板中始终附带WixUI_ErrorProgressTextWIX.template.in。CPACK_WIX_PROGRAM_MENU_FOLDER启动器的开始菜单文件夹名。未设置时初始化为CPACK_PACKAGE_NAME。自 3.16 起若设置为.应用快捷方式将直接创建于开始菜单并且省略卸载快捷方式源码中通过判断cpackWixProgramMenuFolder .关闭emitUninstallShortcut见 cmCPackWIXGenerator.cxx。CPACK_WIX_CULTURES安装程序的语言。语言被编译进 WixUI扩展库直接给出 culture 名称即可使用。多个 culture 以逗号或分号分隔时第一个匹配到语言资源的生效。官方支持语言列表见 WiX 文档的 wixui_localization 页面仓库文档原文引用了该地址此处不展开外部链接。源码中v4 以-culture culture逐项传递v3 以-cultures:...一次性传递。3.4 模板与补丁深度定制入口CPACK_WIX_TEMPLATEWiX 生成的模板文件。设置后使用指定模板生成.wxs文件适合需要进一步定制输出的场景。注意模板内容会覆盖大部分CPACK_WIX_变量的效果。未设置时使用 CMake 自带的默认 MSI 模板v3WIX-v3/WIX.template.inv4WIX.template.in模板选取逻辑在 GenerateMainSourceFileFromTemplate()v3 用WIX-v3/子目录模板v4 用根模板最终 configure 生成main.wxs。模板中的CPACK_WIX_CUSTOM_XMLNS_EXPANDED占位符用于注入自定义命名空间。CPACK_WIX_PATCH_FILE可选自 3.5 起支持多个补丁文件指定一个 XML 文件WIX 生成器将其中的片段注入生成的 WiX 源文件。补丁文件大致遵循如下 RELAX NG compact schemastart CPackWiXPatch CPackWiXPatch element CPackWiXPatch { CPackWiXFragment* } CPackWiXFragment element CPackWiXFragment { attribute Id { string }, fragmentContent* } fragmentContent element * - CPackWiXFragment { (attribute * { text } | text | fragmentContent)* }当前可注入片段到大多数Component、File、Directory和Feature元素。附加的特殊 Id自 3.3 起#PRODUCT对应Product元素#PRODUCTFEATURE对应根Feature元素。自 3.7 起支持补丁任意Feature元素自 3.9 起允许设置额外属性。示例假设生成器创建了如下 XML 元素Component IdCM_CP_applications.bin.my_libapp.exe Guid*/下面这个补丁文件可向其中注入一个 Environment 元素CPackWiXPatch CPackWiXFragment IdCM_CP_applications.bin.my_libapp.exe Environment IdMyEnvironment Actionset NameMyVariableName ValueMyVariableValue/ /CPackWiXFragment /CPackWiXPatch补丁机制由 cmWIXPatch.cxx 与 cmWIXPatchParser.cxx 实现注入点在cmWIXSourceWriter各写入器生成元素时统一调用Patch-ApplyFragment(...)生成结束后还会通过CheckForUnappliedFragments()校验所有补丁片段是否都已生效cmCPackWIXGenerator.cxx。3.5 额外源文件与扩展CPACK_WIX_EXTRA_SOURCES额外的 WiX 源文件.wxs列表会被一并编译与链接。路径必须为绝对路径。源码中通过 AppendUserSuppliedExtraSources() 追加到WixSources。CPACK_WIX_EXTRA_OBJECTS仅 v3额外的 WiX 对象文件.wixobj和/或库文件.wixlib列表路径必须为绝对路径由 AppendUserSuppliedExtraObjects() 追加到light链接输入。CPACK_WIX_EXTENSIONS为所有 WiX 工具指定额外扩展列表。命名规则见上文工具链小节v4 为WixToolset.Name.wixextv3 为WixNameExtension。CPACK_WIX_TOOL_EXTENSIONS为特定 WiX 工具指定额外扩展。v4 的TOOL为BUILDv3 的TOOL为CANDLE、LIGHT。从 InitializeWiXConfiguration() 可见v3 下CPACK_WIX_EXTENSIONS会同时作用于 candle 与 light而CPACK_WIX_CANDLE_EXTENSIONS/CPACK_WIX_LIGHT_EXTENSIONS分别作用于各自工具。CPACK_WIX_TOOL_EXTRA_FLAGS为特定 WiX 工具追加额外命令行参数。使用风险自负未来 CPack 版本生成的参数可能与你的参数冲突。实现上由 AddCustomFlags() 原样拼入命令行。CPACK_WIX_ROOT自定义 WiX Toolset 安装根目录可选。未指定时CPack 通过WIX环境变量定位工具CPackWIX.cmake。CPACK_WIX_CUSTOM_XMLNS自 3.19 起自定义命名空间声明列表用于支持 WiX 扩展。每项形如nameurlname是不带xmlns:前缀的命名空间名url是不加引号的命名空间 URL。常见 WiX schema 列表见 WiX 官方 xsd 页面仓库文档原文引用了该地址。源码中由 CollectXmlNamespaces() 收集并经 InjectXmlNamespaces() 注入所有生成的源文件。CPACK_WIX_SKIP_WIX_UI_EXTENSION自 3.23 起设为 true 时跳过默认包含的 WiXUI扩展即不再向 WiX 工具传递-ext WixUIExtensionv3或-ext WixToolset.UI.wixextv4参数源码见 InitializeWiXConfiguration()。3.6 架构与安装范围CPACK_WIX_ARCHITECTURE自 3.24 起可选设置安装包的目标架构例如x64或arm64。未指定时 CPack 依据CPACK_WIX_SIZEOF_VOID_P推断为x64或x86GetArchitecture()。CPACK_WIX_INSTALL_SCOPE自 3.29 起设置安装器的InstallScope属性取值perMachine为所有用户安装需要管理员权限开始菜单条目对所有用户可见。默认值v4 与 v3 在 CPackWIX.cmake 中分别默认perMachine/NONE文档另注见策略 CMP0172。perUser仅当前用户安装不需要管理员权限开始菜单条目仅当前用户可见。为支持 per-user 安装安装器需生成额外的注册表项作为已装组件的 key paths对应 MSI 验证规则 ICE38这些注册表项创建于HKEY_CURRENT_USER下路径由CPACK_WIX_COMPONENT_KEYS_REGISTRY_PATH指定。注意CMake 4.3 之前该值仅保留未实现。NONE创建不含任何InstallScope属性的安装器。仅当CPACK_WIX_VERSION未设置或为3时支持。该值已弃用3.29 弃用仅为兼容 CPack 3.28 及更早版本的不一致行为生成的安装器需要管理员权限、安装到系统级ProgramFiles但开始菜单条目与卸载注册仅对当前用户创建。警告不同InstallScope值创建的安装器之间无法被干净地更新或互相替换。例如要从NONE迁移到perMachine、或从perMachine迁移到perUser后一个安装器应附带先手动卸载旧版本的说明。默认模板对InstallScope的处理可见 WIX-v3/WIX.template.inNONE时输出不带 InstallScope 的Package否则输出带InstallScope$(var.CPACK_WIX_INSTALL_SCOPE)的Packagev4 模板则始终输出Scope$(var.CPACK_WIX_INSTALL_SCOPE)。CPACK_WIX_COMPONENT_KEYS_REGISTRY_PATH自 4.3 起当CPACK_WIX_INSTALL_SCOPE为perUser时安装器在HKEY_CURRENT_USER下创建组件 key path 注册表项的路径。路径分隔符建议使用正斜杠/会自动转换为反斜杠\源码见 cmCPackWIXGenerator.cxx。默认值为Software/Vendor/PackageName/Components其中Vendor取自CPACK_PACKAGE_VENDORPackageName取自CPACK_PACKAGE_NAME。例如Software/MyCompany/MyProduct/Components。3.7 安装目录与文件布局CPACK_WIX_ROOT_FEATURE_TITLE自 3.7 起设置 WIX 安装器中根安装功能的名称与组件的CPACK_COMPONENT_compName_DISPLAY_NAME语义一致。未设置时使用CPACK_PACKAGE_NAME源码见 cmCPackWIXGenerator.cxx。CPACK_WIX_ROOT_FEATURE_DESCRIPTION自 3.7 起设置根安装功能的描述与组件的CPACK_COMPONENT_compName_DESCRIPTION语义一致。CPACK_WIX_SKIP_PROGRAM_FOLDER自 3.7 起设为 true 时生成包的默认安装位置直接为CPACK_PACKAGE_INSTALL_DIRECTORY不再位于ProgramFiles或ProgramFiles64之下。注意使用该特性创建的安装器不考虑创建安装包的系统与实际安装系统的差异因此可能出现试图安装到不可用的驱动器、或不符合目标系统本地化/惯例路径的情况。同时要注意当跳过 ProgramFiles 目录时默认组件 GUID*无法使用生成器会改用 CMake 生成的 GUIDcmCPackWIXGenerator.cxx。CPACK_WIX_ROOT_FOLDER_ID自 3.9 起指定自定义根文件夹 ID。生成器特有的64标记可用于同时存在 32/64 位变体的文件夹 ID32 位构建中该标记展开为空64 位构建中展开为64。未设置时CPACK_WIX_INSTALL_SCOPE为perUser则安装到LocalAppDataFolder否则安装到ProgramFiles64Folder。完整逻辑见 GetRootFolderId()。3.8 组件、注册表与打包性能CPACK_WIX_CMAKE_PACKAGE_REGISTRY设置后生成的安装器会在注册表HKEY_LOCAL_MACHINE\Software\Kitware\CMake\Packages\PackageName创建条目PackageName即该变量值。若同时安装了 CMake 配置文件其他 CMake 项目即可用find_package找到你的包。源码中通过 CreateCMakePackageRegistryEntry() 生成其中还携带了CPACK_WIX_UPGRADE_GUID。CPACK_WIX_PROPERTY_PROPERTY自 3.1 起为 Windows Installer 属性PROPERTY提供值。可用于定制程序和功能又称添加或删除程序中的信息常用示例属性属性含义ARPCOMMENTS注释ARPHELPLINK帮助和支持信息 URLARPURLINFOABOUT常规信息 URLARPURLUPDATEINFO更新信息 URLARPHELPTELEPHONE帮助和支持电话号码ARPSIZE应用程序大小千字节 KB实现上CreateWiXPropertiesIncludeFile() 扫描所有以CPACK_WIX_PROPERTY_开头的选项生成Property Id... Value.../元素。同时若未设置CPACK_WIX_PROPERTY_ARPINSTALLLOCATION生成器会自动创建INSTALL_ROOT安全属性并通过RegistrySearch在卸载注册表里反查安装位置再以SetProperty填充ARPINSTALLLOCATION保证添加或删除程序能显示正确的安装路径。此外若设置了CPACK_PACKAGE_CONTACT而未显式设置CPACK_WIX_PROPERTY_ARPCONTACT会自动把联系人填入 ARPCONTACTcmCPackWIXGenerator.cxx。CPACK_WIX_CAB_PER_COMPONENT自 4.2 起设为 true 时每个组件生成一个.cab文件默认为整个安装包的所有文件生成单个.cab。WiX 会并行生成.cab文件因此多个.cab可能更有利于加快打包速度。源码中 CreateWiXProductFragmentIncludeFile() 按组件数量生成mediaN.cab的Media定义AddComponentsToFeature() 则为每个组件分配独立 diskId未开启时默认模板只声明Media Id1 Cabinetmedia1.cab EmbedCabyes/。四、组件化安装与快捷方式WIX 生成器支持 CPack 组件化安装SupportsComponentInstallation()为 true其组件与功能Feature的映射关系在 CreateFeatureHierarchy() 中建立组件组ComponentGroups与无组组件会分别生成对应Feature每个组件对应一个以CM_C_compName命名的 feature Id。快捷方式方面相关函数 CreateShortcuts() 与 CreateShortcutsOfSpecificType()通过CPACK_PACKAGE_EXECUTABLES成对的executable与text label创建开始菜单快捷方式可选的CPACK_CREATE_DESKTOP_LINKS同时创建桌面快捷方式AddComponentsToFile 路径 中对.exe文件名进行小写匹配开始菜单快捷方式组件还会自动生成卸载快捷方式EmitUninstallShortcut除非CPACK_WIX_PROGRAM_MENU_FOLDER为.为组件设置CPACK_WIX_ACL安装文件属性可生成访问控制列表ACL相关条目该逻辑位于 cmWIXAccessControlList.cxxperUser 安装时快捷方式、目录、文件组件所需的 key path 注册表项由CPACK_WIX_COMPONENT_KEYS_REGISTRY_PATH决定经 cmWIXDirectoriesSourceWriter / cmWIXFilesSourceWriter 传入。五、端到端配置示例下面给出一个可运行的完整示例集中展示常用变量与组件化用法实际配置于CMakeLists.txt的 CPack 部分# 启用 WIX 生成器所需的通用设置 set(CPACK_GENERATOR WIX) set(CPACK_PACKAGE_NAME MyProduct) set(CPACK_PACKAGE_VENDOR MyCompany) set(CPACK_PACKAGE_VERSION 1.2.3) set(CPACK_PACKAGE_CONTACT supportexample.com) set(CPACK_PACKAGE_INSTALL_DIRECTORY MyCompany/MyProduct) # 固定升级 GUID保证后续版本可覆盖旧安装自行用工具生成一次并固化 set(CPACK_WIX_UPGRADE_GUID 01234567-89AB-CDEF-0123-456789ABCDEF) # 可选固定产品 GUID # set(CPACK_WIX_PRODUCT_GUID FEDCBA98-7654-3210-FEDC-BA9876543210) # 许可协议.txt 会被自动转换为 RTF需 UTF-8 编码 set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.txt) # 使用 WiX Toolset v3默认切换 v4 需安装 wix .NET 工具 # set(CPACK_WIX_VERSION 3) # 品牌与 UI set(CPACK_WIX_PRODUCT_ICON ${CMAKE_CURRENT_SOURCE_DIR}/icon.ico) set(CPACK_WIX_UI_BANNER ${CMAKE_CURRENT_SOURCE_DIR}/banner.bmp) # 493x58 set(CPACK_WIX_UI_DIALOG ${CMAKE_CURRENT_SOURCE_DIR}/dialog.bmp) # 493x312 set(CPACK_WIX_CULTURES zh-CN;en-US) # 安装范围与开始菜单 set(CPACK_WIX_INSTALL_SCOPE perMachine) set(CPACK_WIX_PROGRAM_MENU_FOLDER MyCompany/MyProduct) # 添加或删除程序信息 set(CPACK_WIX_PROPERTY_ARPURLINFOABOUT https://example.com/about) set(CPACK_WIX_PROPERTY_ARPURLUPDATEINFO https://example.com/update) # 组件定义未定义组件时默认使用 WixUI_InstallDir set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE) include(CPack)打包命令Windowscmake -G NMake Makefiles -DCPACK_GENERATORWIX .. cmake --build . --config Release cpack -G WIX产物为_CPack_Packages目录下的.msi文件。若 CPack 找不到 WiX 工具请检查PATHv3 的candle/lightv4 的wix或设置WIX环境变量指向工具根目录。六、调试与常见问题找不到candle/light/wix确认 CPackWIX.cmake 的查找路径是否覆盖你的安装位置PATH、CPACK_WIX_ROOT、WIX环境变量、PATH_SUFFIXES bin。CPACK_WIX_VERSION非法取值只接受3或4其余值会直接报错退出。许可协议无法转换确认源文件为 UTF-8 编码的.txt或原生.rtf其他扩展名如.md会触发 unsupported WiX License file extension 错误此时应使用CPACK_WIX_LICENSE_RTF显式指定。图标/横幅尺寸不符CPACK_WIX_UI_BANNER必须 493×58CPACK_WIX_UI_DIALOG必须 493×312否则安装界面显示异常。升级无法覆盖旧版检查CPACK_WIX_UPGRADE_GUID是否固定为与旧安装包相同的 GUID。per-user 安装异常CPACK_WIX_INSTALL_SCOPEperUser需要 CMake 4.3 支持并依赖CPACK_WIX_COMPONENT_KEYS_REGISTRY_PATH默认Software/Vendor/PackageName/Components生成 key path 注册表项。调试工具调用WiX 命令及其输出会追加写入打包目录下的日志文件报错信息中会提示具体日志路径见 RunWiXCommand()。七、小结CPack 的 WIX 生成器把 WiX Toolset 的能力完整封装进 CMake 生态通过CPACK_WIX_VERSION在 v4wix build与 v3candlelight两套工具链间切换用十余个CPACK_WIX_*变量覆盖 GUID、许可协议、UI、快捷方式、安装范围、注册表与打包性能等全部关键环节。默认模板WIX-v3/WIX.template.in 与 WIX.template.in承担绝大多数生成工作而CPACK_WIX_TEMPLATE与CPACK_WIX_PATCH_FILE则为需要深度定制的项目保留了完整的扩展入口。如需进一步深入实现细节可直接研读 Source/CPack/WiX 目录下的生成器源码与各写入器实现。赞分享构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载相关推荐Windows安装包制作神器WiX Toolset完全指南Windows安装包制作神器WiX Toolset完全指南 还在为Windows软件打包分发而烦恼吗 想要一个既专业又免费的安装包制作工具WiX To开发工具构建工具WiX Toolset构建Windows安装包的强大工具WiX Toolset构建Windows安装包的强大工具 项目介绍 WiX Toolset 是一个开源的Windows安装包构建工具它允许开发者通过XML源开发工具构建工具WiX Toolset 安装调试指南如何获取 Windows Installer 安装日志WiX Toolset 安装调试指南如何获取 Windows Installer 安装日志 在编写 WiX Toolset 安装程序时调试安装失败、文件搜索开发工具构建工具上一篇Rust重构Nacos服务r-nacos项目全方位解析与实战指南下一篇Julia实时分析流式数据处理与监控系统的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

3步拿到八大网盘直链:网盘直链下载助手从安装到调优一篇讲透

3步拿到八大网盘直链:网盘直链下载助手从安装到调优一篇讲透

3步拿到八大网盘直链:网盘直链下载助手从安装到调优一篇讲透 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 …

📅 2026/10/5 1:43:39
面向对象编程(OOP)核心知识体系全解:基于 LinkedIn 技能评估 122 题的四原则、继承、多态与设计模式实战指南

面向对象编程(OOP)核心知识体系全解:基于 LinkedIn 技能评估 122 题的四原则、继承、多态与设计模式实战指南

文档教程知识库教育 【免费下载链接】linkedin-skill-assessments-quizzes Full reference of LinkedIn answers 2024 for skill assessments (aws-lambda, rest-api, javascript, react, git, html, jquery, mongodb, java, Go, python, machine-learning, power-point) linke…

📅 2026/10/5 1:43:39
G-Helper 新手指南:单文件替代 Armoury Crate,快速切换风扇曲线与 GPU 模式

G-Helper 新手指南:单文件替代 Armoury Crate,快速切换风扇曲线与 GPU 模式

G-Helper 新手指南:单文件替代 Armoury Crate,快速切换风扇曲线与 GPU 模式 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar…

📅 2026/10/5 1:43:39
MORE NEWS

更多资讯

📰

当下值得推荐的SEO优化企业,究竟有哪些?

痛点深度剖析我们团队在实践中发现,众多企业在SEO优化过程中面临着诸多棘手问题。在流量获取方面,成本持续攀升,SEO见效慢,很多企业做了半年优化,关键词排名却毫无变动;SEM烧钱快,谷歌广告点击成…

📰

河北内贸网站关键词优化哪家专业

在数字化转型的浪潮下,河北地区众多传统企业纷纷将目光投向了内贸互联网市场。然而,面对海量的信息流和激烈的竞争,许多企业在建站初期便陷入了迷茫:究竟如何通过有效的关键词优化来提升网站排名,进而实现获客&#xf…

📰

绵阳大面积纹身好店复盘,画家纹身凭啥稳居第一?

在纹身消费市场中,大面积纹身向来是门槛最高的细分赛道,不同于小图案的快速创作,满背、花臂、花腿这类大尺寸创作,对纹身店的设计能力、技法功底、项目经验都有着极高要求。不少绵阳的纹身爱好者在筛选服务时,最关心的…

📰

从 POS 到 CRM:服装门店会员数据为什么不能只放在收银里

从 POS 到 CRM:服装门店会员数据为什么不能只放在收银里 很多服装店老板选系统时,第一反应是“先找一套收银软件”。这个判断在单店阶段没有问题。门店刚开业,最急的是收款、开单、录商品、查库存、登记会员和看每天营业额。只要业务简单、门…

📰

工业级MRAM存储方案:GD32VF103VBT6驱动MR25H40CDF实战

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

📰

(142页PPT)PLM+ERP系统选型及建设方案建议书(附下载方式)

篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 https://download.csdn.net/download/2501_92796370/92933136 资料解读:《(142页PPT)PLMERP系统选型及建设方案建议书》 详细资料请看本解读文章的最后内容。…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬