CMake 安装具有相对路径的目标
CMake install targets with relative paths
我正在尝试弄清楚如何编写一个可以通过在另一个项目中调用find_package()
来使用的库。我正在尝试遵循 Catch2 存储库 CMake 文件。
这是我提出的最小版本:(git 存储库可在此处获得)
cmake_minimum_required(VERSION 3.14.4)
set(project_name "hello")
project(${project_name} LANGUAGES CXX)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
add_library(${project_name} STATIC)
target_sources(${project_name} PRIVATE "src/hello.cpp")
target_include_directories(${project_name}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/src/>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
install(
DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/src/
DESTINATION include
FILES_MATCHING REGEX "src/.+.h"
PERMISSIONS
OWNER_READ
GROUP_READ
WORLD_READ)
set(PROJECT_CMAKE_CONFIG_DESTINATION ${CMAKE_INSTALL_LIBDIR}/../)
configure_package_config_file(
${CMAKE_CURRENT_LIST_DIR}/cmake/${project_name}Config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/${project_name}Config.cmake
INSTALL_DESTINATION
${PROJECT_CMAKE_CONFIG_DESTINATION})
install(
TARGETS
${project_name}
EXPORT
${project_name}Targets
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
install(
EXPORT
${project_name}Targets
NAMESPACE
${project_name}::
DESTINATION
${PROJECT_CMAKE_CONFIG_DESTINATION})
install(
FILES
"${CMAKE_CURRENT_BINARY_DIR}/${project_name}Config.cmake"
DESTINATION
${PROJECT_CMAKE_CONFIG_DESTINATION})
然后我安装正在使用:
- cmake -DCMAKE_INSTALL_PREFIX:PATH="C:tmpinstall"
- cmake --build . --install target
一切似乎都被复制到正确的道路上。但是,当我尝试使用另一个使用我的测试库的项目find_package()
时,出现以下错误:
CMake Error at C:/tmp/install/helloTargets.cmake:76 (message):
The imported target "hello::hello" references the file
"C://lib/hello.lib"
but this file does not exist. Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
"C:/tmp/install/helloTargets.cmake"
but not all the files it references.
Call Stack (most recent call first):
C:/tmp/install/helloConfig.cmake:33 (include)
CMakeLists.txt:15 (find_package)
它似乎缺少 cmake 安装目录的路径。如何修改安装功能,以便生成的配置文件可以被find_package()
使用?
在您的 CMakeList 中,现阶段很少有几率的事情.txt :
target_include_directories(${project_name} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/src/> # there is no header in this folder so this has no effect # maybe create a include/ folder to make it more "legit" $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
-
您应该在target_sources中沿.cpp指定头文件。这有2个效果:
- 当你做安装(目标你好)时,你可以添加PUBLIC_HEADER关键字来安装属于目标的每个标头到${CMAKE_INSTALL_INCLUDEDIR}。这样,您就不需要使用正则表达式进行安装(目录)
- IDE 将向他们显示
-
在 helloConfig.cmake.in
if(NOT TARGET hello::hello)
我认为当您使用 configure_package_config_file() 时,生成的导出文件有一些逻辑可以防止多重包含。
最后,我认为您的主要问题是由于PROJECT_CMAKE_CONFIG_DESTINATION的位置,如果您删除最后一个"/",我认为它应该可以解决问题。
编辑 13.06 : 计算所有相对路径的基本路径是错误的,因为PROJECT_CMAKE_CONFIG_DESTINATION设置为"lib/../" 一些关于 CMake 如何计算相对路径
的文档您尝试使用"${CMAKE_INSTALL_LIBDIR}/.. 实现的目标。/" 实际上是 "." 所以基本路径是 ${CMAKE_INSTALL_PREFIX}。 另一种方法是安装在像${CMAKE_INSTALL_LIBDIR}/cmake这样的子文件夹中,或者只是"cmake"工作
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++A*算法并不总是在路径中具有目标节点
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- 使用 Libssh 将文件从服务器复制到客户端:分配文件复制目标路径时出现问题
- 在QT中的大型项目中指定构建/目标/安装路径
- CMake 安装具有相对路径的目标
- 如何获取外部项目定义的目标的输出路径?
- GTEST单元测试目标配置文件路径
- CMAKE出口目标具有绝对路径
- 提升 BGL BFS 查找从源到目标的所有唯一路径
- 获取交汇点的目标路径似乎总是以"Error 5 Access Denied"结尾
- 当目标路径存在时,curl SFTP 重命名
- 使用qmake将dll安装到2个目标(路径)中
- 为什么在c++中用shell链接查找快捷方式的目标路径时,它指的是windowsinstaller文件夹
- 如何记录从源顶点到目标顶点的所有最短路径
- 如何从g++生成的目标代码中去掉表示源头文件的绝对路径的字符串
- (make/g++)包含自动生成的依赖目标的完整路径?(或方法)
- 为什么boost::filesystem::canonical()要求目标路径存在?
- Qt拖放到windows资源管理器:我如何知道拖放的目标路径
- Dijktra's-如何在从源到目标的最短路径中跟踪节点