如何让 CMake 在 运行 "cmake install" 时复制包含目录?

How do I ask CMake to copy include directory while running "cmake install"?

以前,我正在寻找此类问题,但其中 none 个正在作为示例 and this one

目前,我正在创建一个 C 库,它应该输出一个共享库(*.so*.dll)文件和 ./include 中的多个 *.h 文件目录。共享库已成功构建并安装到 /usr/local/lib。但是,我不知道如何告诉 CMake 将 *.h 文件复制到正确的目的地,如下所示。

我知道我可以通过使用 Python 脚本复制那些 *.h 或在 CMake 上使用 if-else 逻辑来解决这个问题。但至少告诉我 CMake 中是否有做那件事的功能。谢谢!

这是我的 CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)
project (
  learn_c_library
  VERSION 1.0.0
  LANGUAGES C
)

# Specify CMake build and output directory
set(CMAKE_BINARY_DIR "${PROJECT_SOURCE_DIR}/.cmake")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/out")

# Use every .c file inside ./src
file(GLOB_RECURSE MY_SOURCE_PATH "src/*")

add_library(
  ${PROJECT_NAME} SHARED
  ${MY_SOURCE_PATH}
)
include_directories(
  ${PROJECT_NAME}
  "include/"
)

# Allows "make install" to install shared library
install(TARGETS ${PROJECT_NAME})

折腾了几天 CMake,终于找到解决办法了!

假设您将 public *.h 存储在 ./include 目录中,那么将 *.h 文件安装到计算机的语法如下:

install(
  DIRECTORY
    "include/" # Your global headers location in the project
  DESTINATION
    include # This is your system's default "include" location
)

我从 here 得到了解决方案,将 usr/myproject 替换为 include

这个答案改进了

cmake_minimum_required(VERSION 3.14)

# ...

include(GNUInstallDirs)

install(DIRECTORY "include/"
        TYPE INCLUDE
        COMPONENT MyProj_Development)

GNUInstallDirs 模块提供了用于自定义项目安装布局的标准配置点。基本上应该始终使用这些变量,而不是硬编码 path/directory 名称。

CMake 3.14 中引入了 install()TYPE INCLUDE 参数,并使用 GNUInstallDirs 的 CMAKE_INSTALL_INCLUDEDIR 变量来确定目的地。

最后,特别是如果您的项目是一个库,您的所有 install() 规则都应该被赋予一个 COMPONENT 参数,以允许在运行时和开发包之间拆分文件(以及可能的其他文件,如文档和体系结构无关的数据文件)。