通常,类型的相对参数PATH,如"lib"或"source/include"在CMake中使用变量的当前值解析为绝对路径,例如:${CMAKE_INSTALL_PREFIX}在命令的情况下INSTALL.但是,如果我想使用空的相对路径(或者根本不设置它),那么这不起作用,因此得到的绝对路径等于${CMAKE_INSTALL_PREFIX}- CMake生成器会抱怨不存在DESTINATION,尽管没有理由为什么无法解决.
我知道这个问题的两个解决方法,但两者都有它们的缺陷阻止我实现我的目标:
${CMAKE_INSTALL_PREFIX}的DESTINATION值.这正确地解决了路径,但是在INSTALL(EXPORT)生成的情况下,生成的路径Target.cmake是绝对的,这使得包不可重定位.使用.的DESTINATION.这至少在内部生成相对路径Target.cmake,但路径不正确..显然被认为是一个常规文件夹,并且在Target.cmake生成过程中,当_IMPORT_PREFIX确定时,CMake过多地剥离了一个文件夹组件:
# Compute the installation prefix relative to this file.
get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
Run Code Online (Sandbox Code Playgroud)还有其他解决方法吗?你认为缺乏空的相对路径可能被认为是一个错误吗?
小智 0
我想我找到了一些解决方案。这将强制 cmake 生成导出文件,其中_IMPORT_PREFIX设置为导出的 cmake 的当前位置。在安装和导出序列之前修改 CMAKE_INSTALL_PREFIX,如下所示:
set(CMAKE_INSTALL_PREFIX "\${CMAKE_CURRENT_LIST_FILE}/..")
Run Code Online (Sandbox Code Playgroud)
\前面的符号阻止${CMAKE_CURRENT_LIST_FILE}此时评估变量引用${CMAKE_CURRENT_LIST_FILE},它只是作为字符串传递。之后在导出的 cmake 中你将得到:
set(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}/..")
Run Code Online (Sandbox Code Playgroud)
您需要/..在末尾添加,因为set函数将设置_IMPORT_PREFIX导出的 cmake 的整体路径以及 cmake 文件名(例如C:/Works/project/ext/library/Library.cmake),因此/..将删除/Library.cmake. 完美的结果是强制 cmakeget_filename_component在导出的文件中使用,例如:
get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
Run Code Online (Sandbox Code Playgroud)
但正如我在评论中提到的,cmake 的实现可能是不可能的。
不知道修改后CMAKE_INSTALL_PREFIX有没有副作用。在 UNIX 平台上,您可以尝试使用DESTDIR代替作为 的CMAKE_INSTALL_PREFIX参数make,但我还没有尝试过。
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |