如何用 CPack 生成 WIX 包?

Posted

技术标签:

【中文标题】如何用 CPack 生成 WIX 包?【英文标题】:How to with CPack generate the WIX package? 【发布时间】:2018-08-06 08:13:54 【问题描述】:

我使用的是 cmake 3.12.0。存在一个创建一个控制台应用程序的 cmake 项目。我在那个 cmake 项目中添加了包生成的能力:

# ... above cmake code for one console application creation
# below code that I add:

# pack
set (A_PACK_DESCRIPTION_SUMMARY "$PROJECT_NAME - CMake Assistant Solution")
set (A_INSTALL_PREFIX Consolas)

set(CPACK_WIX_PRODUCT_GUID "F9AAAAE2-D6AF-4EA4-BF46-B3E265400CC8") 
set(CPACK_WIX_UPGRADE_GUID "F9AAAAE2-D6AF-4EA4-BF46-B3E265400CC7")

set(CPACK_GENERATOR "WIX")

include(CPack)

使用其他生成器(NSIS、7Z、ZIP、DEB)一切正常,但使用 WIX 时出现以下错误:

...path\files.wxs(11):错误 LGHT0091:找到重复的符号“组件:CM_C_EMPTY_INSTALL_ROOT”。这通常意味着一个 Id 是重复的。检查以确保给定类型(文件、组件、功能)的所有标识符都是唯一的。

为什么会发生以及如何解决?

【问题讨论】:

【参考方案1】:

这似乎是由this bug引起的

基本上你使用add_subdirectory(xxx EXCLUDE_FROM_ALL),其中子目录有一个install(... COMPONENT ...) 调用。已安装的文件会从子目录中排除,但仍会创建 COMPONENTs,它们现在是空的并且会破坏 wix。

作为一种解决方法,您可以添加:

set(CPACK_COMPONENTS_ALL Unspecified)

CMakeLists.txt 中排除所有空组件。

【讨论】:

【参考方案2】:

如果有帮助的话,我遇到了这个问题,发现我有只指定发布配置的 INSTALL 命令,但随后尝试使用调试构建配置来构建包。通过切换到构建指定发布配置的包,一切都按预期进行(浪费了一个下午的大部分时间才弄清楚这一点!)

【讨论】:

我检查了这个,但它对所有操作(构建、测试、打包)都使用了发布配置 scipt 版本。

以上是关于如何用 CPack 生成 WIX 包?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用补丁文件修改 CPack 生成的 WiX XML?

CPack WIX 在安装树之外安装一个文件

CPack 一次构建多个包的问题

如何为使用 CPack 创建的 deb 包创建桌面图标?

在 Windows 上使用 CPack 生成源代码包

CMake/CPack - 生成 Debian 包维护者脚本(特别是 postrm)