使用 CPack NSIS 生成 Windows 安装程序时出现错误“绝对路径安装目标禁止(调用者)”

问题描述 投票:0回答:2

我试图在 VS 项目中运行数据包生成器,它在编译时崩溃,因为在安装时使用目标和文件的绝对路径。

 ABSOLUTE path INSTALL DESTINATION forbidden (by caller): ...

我检查了两次,所有安装目录都是相对的。我设置了很多变量作为

${PROJECT_BINARY_DIR}
的子文件夹(应该是相对的),例如:

set(INSTALL_DIR ${PROJECT_BINARY_DIR}/bin)
set(LIB_DIR ${PROJECT_BINARY_DIR}/bin/lib)
set(EXT_DIR ${PROJECT_BINARY_DIR}/bin/ext)
...

CMAKE/CPACK 是否将这些变量解释为绝对路径? 如果是这样,有没有办法让 CPack 使用这些变量正常工作? 涉及到子相对路径时如何使用CPack?

cmake nsis cpack
2个回答
1
投票

好吧,我明白了,${PROJECT_BINARY_DIR} 被解释为绝对路径,从那里开始,它的所有子文件夹都将被拒绝。

为了避免这个问题,我将安装变量包围在 if else 块中,如果是打包的情况,则将使用相对文件夹,如下所示:

if(PACK)
   set(INSTALL_DIR bin)
   set(LIB_DIR bin/lib)
   set(EXT_DIR /bin/ext)
   ...
else(PACK)
   set(INSTALL_DIR ${PROJECT_BINARY_DIR}/bin)
   set(LIB_DIR ${PROJECT_BINARY_DIR}/bin/lib)
   set(EXT_DIR ${PROJECT_BINARY_DIR}/bin/ext)
   ...
endif(PACK)

这解决了它,但它真的很脏,等待新的 CPack 版本有更好的功能。

再见


1
投票

此致命错误旨在告诉您在用户执行安装程序时应指定安装根目录。我猜你的 cmake 配置中的某个地方可能有这样的代码:

INSTALL (TARGET myApp DESTINATION ${SOME_INSTALL_PATH}/bin )

如果在生成 cmake 缓存时指定

SOME_INSTALL_PATH
绝对路径,则会出现
CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION
错误,并给出
"ABSOLUTE path INSTALL DESTINATION forbidden (by caller)"
消息。

要解决此问题,要么始终使用相对路径进行安装

DESTINATION
,要么仅将包前缀分配给
SOME_INSTALL_PATH
变量。

作为参考,以下是

INSTALL
命令的链接。 http://www.cmake.org/cmake/help/v3.0/variable/CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION.html

CMake 邮件列表上也提出了类似的问题。 http://public.kitware.com/pipermail/cmake/2013-May/054656.html

© www.soinside.com 2019 - 2024. All rights reserved.