gpt4 book ai didi

c++ - CMake 使用相对路径安装目标

转载 作者:行者123 更新时间:2023-11-28 04:16:13 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何编写一个可以通过在另一个项目中调用 find_package() 来使用的库。我正在尝试遵循 Catch2 存储库 CMake file .

这是我想出的最小版本:(git repo 可用 here )

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:\tmp\install"
- 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() 使用?

最佳答案

在此阶段,您的 CMakeLists.txt 中几乎没有什么是奇怪的:

  1. 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}>)
  2. 您应该在 target_sources 中的 .cpp 中指定头文件。这有两个效果:

    • 当您执行install(TARGETS hello) 时,您可以添加PUBLIC_HEADER 关键字以将属于目标的每个 header 安装到${CMAKE_INSTALL_INCLUDEDIR}。这样,您就不需要使用正则表达式进行安装(目录)
    • IDE 会显示它们
  3. 在 helloConfig.cmake.in 中

if(NOT TARGET hello::hello)

我认为当您使用 configure_package_config_file() 时,生成的导出文件具有一些防止多重包含的逻辑。

最后,我认为你的主要问题是由于 PROJECT_CMAKE_CONFIG_DESTINATION 的位置,如果你删除最后一个“/”我认为它应该可以解决问题。

编辑 13.06:由于 PROJECT_CMAKE_CONFIG_DESTINATION 设置为“lib/../”,计算所有相对路径的基本路径是错误的 some doc about how CMake computes the relative path

你试图用“${CMAKE_INSTALL_LIBDIR}/../”实现的实际上是“.”所以基本路径是 ${CMAKE_INSTALL_PREFIX}。另一种方法是安装在 ${CMAKE_INSTALL_LIBDIR}/cmake 之类的子文件夹中,或者也可以只安装“cmake”

关于c++ - CMake 使用相对路径安装目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56554347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com