如何通过CMake向Wix的directories.wxs注入代码补丁创建快捷方式
解决CMake+Wix打包时的快捷方式问题及补丁ID错误
错误原因
报错Some xml patch fragments did not have matching ids: 'targetdir'是因为Wix的元素ID大小写敏感,你在<CPackWiXPatch>里写的targetdir是小写,而CPack自动生成的directories.wxs中根目录的ID是大写的TARGETDIR,两者不匹配导致无法定位目标元素。
正确的补丁写法及快捷方式实现步骤
1. 修正补丁的Target ID
所有涉及根目录的补丁,必须把Target属性值设为大写的TARGETDIR,和Wix生成的目录ID严格匹配。
2. 编写完整的Wix补丁文件
创建一个wix_patch.xml文件,包含桌面快捷方式、开始菜单快捷方式的组件定义,以及将组件关联到安装Feature的补丁:
<CPackWiXPatches> <!-- 注入到TARGETDIR目录下,添加桌面和开始菜单的组件 --> <CPackWiXPatch Id="AddShortcutComponents" Target="TARGETDIR" Type="after" File="directories.wxs"> <Fragment> <!-- 桌面快捷方式组件 --> <DirectoryRef Id="DesktopFolder"> <Component Id="DesktopAppShortcut" Guid="替换为你的唯一GUID"> <Shortcut Id="DesktopShortcut" Name="你的程序名称" Description="程序功能描述" Target="[INSTALL_DIR]\你的程序.exe" WorkingDirectory="INSTALL_DIR" /> <RemoveFolder Id="CleanDesktopShortcut" On="uninstall" /> <RegistryValue Root="HKCU" Key="Software\你的公司名\你的程序名" Name="HasDesktopShortcut" Type="integer" Value="1" KeyPath="yes" /> </Component> </DirectoryRef> <!-- 开始菜单快捷方式组件 --> <DirectoryRef Id="ApplicationProgramsFolder"> <Component Id="StartMenuAppShortcut" Guid="替换为另一个唯一GUID"> <Shortcut Id="StartMenuShortcut" Name="你的程序名称" Description="程序功能描述" Target="[INSTALL_DIR]\你的程序.exe" WorkingDirectory="INSTALL_DIR" /> <RemoveFolder Id="CleanStartMenuFolder" On="uninstall" /> <RegistryValue Root="HKCU" Key="Software\你的公司名\你的程序名" Name="HasStartMenuShortcut" Type="integer" Value="1" KeyPath="yes" /> </Component> </DirectoryRef> </Fragment> </CPackWiXPatch> <!-- 将快捷方式组件关联到默认安装Feature --> <CPackWiXPatch Id="LinkShortcutsToFeature" Target="Complete" Type="after" File="features.wxs"> <Fragment> <ComponentRef Id="DesktopAppShortcut" /> <ComponentRef Id="StartMenuAppShortcut" /> </Fragment> </CPackWiXPatch> </CPackWiXPatches>
3. 在CMakeLists.txt中指定补丁文件
添加以下代码,让CPack加载这个补丁:
set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_SOURCE_DIR}/wix_patch.xml")
关键注意事项
- GUID生成:每个
<Component>的Guid必须唯一,可以用Visual Studio的GUID生成器或其他工具生成,不能重复。 - 路径变量:
[INSTALL_DIR]对应你的程序安装根目录,如果程序安装在bin子目录,需要改成[INSTALL_DIR]\bin\你的程序.exe。 - Feature关联:CPack默认生成的安装Feature ID是
Complete,如果项目自定义了Feature ID,需要替换成对应的ID。
内容的提问来源于stack exchange,提问作者dbz
相关产品推荐
相关产品推荐

