我正在尝试使用CPack WiX Generator生成msi-package。
在我的CMakeLists.txt
中,CMAKE_INSTALL_PREFIX
设置为"C:/Program Files/My Project"
。我需要有完整的路径,因为项目源代码的一些重要部分依赖于这条路径。此外,我将项目拆分为一些组件,其中一个组件名为core
。
我使用cmake-gui成功生成了Visual Studio解决方案。但是当我尝试构建项目PACKAGE
时,我收到以下错误:
53>EXEC : CPack error : Problem creating temporary directory: D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/coreC:/Program Files/My Project
当我将CMAKE_INSTALL_PREFIX
留空时,会发生同样的错误。在这种情况下,此变量默认初始化为"C:/Program Files/Project_Name"
,rror为:
53>EXEC : CPack error : Problem creating temporary directory: D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/coreC:/Program Files/Project_Name
仅当我将CMAKE_INSTALL_PREFIX
设置为My Project
时(缺少前置C:/
或/
),一切正常。该目录创建为D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/coreMy Project
并创建了msi-package。
看来,CPack尝试将make DESTDIR="D:/Projects/build-Project-MSVC2015/_CPack_Packages/win64/WIX/project-2.3.0-20.AMD64/core"
安装为中间步骤,但正如cmake's documentation所述:
警告:DESTDIR可能不会在Windows上使用,因为安装前缀通常包含一个驱动器号,如“C:/ Program Files”中的驱动器号,不能添加其他前缀。
我是否误解了CMAKE_INSTALL_PREFIX
与CPack WiX Generator的用法?或者这是特定于Visual Studio?或者是否有针对此问题的解决方法,例如强制DESTDIR
为空(是的,我知道这很危险)?
答案 0 :(得分:0)
我真的有点误解了CPack的用法。在阅读了有关CPack的一些信息后,我设法通过以下方式创建了一个msi-package。
对于基于Windows的软件包安装,我通过将CPACK_SET_DESTDIR
设置为FALSE来关闭DESTDIR
的使用。
正如cmake关于CPACK_SET_DESTDIR
的文档中所述:
最显着的区别是没有CPACK_SET_DESTDIR, CPack使用CPACK_PACKAGING_INSTALL_PREFIX作为前缀,而使用 CPACK_SET_DESTDIR设置,CPack将使用CMAKE_INSTALL_PREFIX作为 前缀。
也就是说,我应该将CPACK_PACKAGING_INSTALL_PREFIX
变量设置为适当的值。
如果我将CPACK_PACKAGING_INSTALL_PREFIX
设置为非空值,e。 G。到/My Project
(注意领先的/
),CPack会将此附加到C:/Program files/${CPACK_PACKAGE_INSTALL_DIRECTORY}
。反过来,CPACK_PACKAGE_INSTALL_DIRECTORY
默认为"${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}"
。如果我将C:/Program Files/my-project 1.0.0/My Project
设置为CPACK_PACKAGE_NAME
而将"my-project"
设置为CPACK_PACKAGE_VERSION
,则完整安装路径为1.0.0
。
因此,要构建一个将程序安装到C:\Program files\My Project
的msi-package,我在CMakeLists.txt
中使用以下行:
SET(CMAKE_INSTALL_PREFIX "C:/Program Files/My Project" CACHE PATH "Install path" FORCE)
...
SET(CPACK_SET_DESTDIR FALSE)
SET(CPACK_PACKAGE_INSTALL_DIRECTORY "My Project")
SET(CPACK_PACKAGING_INSTALL_PREFIX "")
对于WiX生成器CPACK_PACKAGE_INSTALL_DIRECTORY
可能不包含完整路径,因此SET(CPACK_PACKAGE_INSTALL_DIRECTORY ${CMAKE_INSTALL_PREFIX})
将无效。
CPACK_PACKAGING_INSTALL_PREFIX
默认情况下似乎为空,因此最后一行是多余的。