【问题标题】:How do I ask CMake to copy include directory while running "cmake install"?如何在运行“cmake install”时要求 CMake 复制包含目录?
【发布时间】:2021-08-02 09:02:01
【问题描述】:

以前,我正在寻找此类问题,但没有一个可以作为示例 this threadthis one

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

  • 在 POSIX 中:/usr/local/include
  • 在 Windows 中:C:\<Compiler Path>\include

我知道我可以通过使用 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})

【问题讨论】:

  • 你能告诉我们你当前的 CMakeLists.txt 是什么样的吗?通常你的 CMake 文件定义 what 来安装,调用者定义 where 来安装它,但是如果你真的必须的话,你可以覆盖它。
  • @Botje 当然,我编辑了问题
  • It is best practice to not use globs in CMake,但如果你绝对拒绝列出你的来源,那么至少非常非常至少使用CONFIGURE_DEPENDS
  • 从不设置变量CMAKE_BINARY_DIR。此变量由 CMake 自动设置,CMake 对其值有预期。但是设置您(或构建您的项目的人)的变量可能会面临许多微妙的错误。最好假设变量CMAKE_BINARY_DIR 是只读变量。
  • @AlexReinking 哇,这是我应该在重建之前删除 CMakeFiles 目录的唯一原因。我喜欢你的博客,谢谢分享!

标签: c cmake build


【解决方案1】:

这个答案改进了your answer

cmake_minimum_required(VERSION 3.14)

# ...

include(GNUInstallDirs)

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

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

install()TYPE INCLUDE 参数是在 CMake 3.14 中引入的,它使用 GNUInstallDirs 的 CMAKE_INSTALL_INCLUDEDIR 变量来确定目标。

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

【讨论】:

  • 确认可以工作,但我仍然混淆了TARGETCOMPONENT 之间的区别。你能解释一下吗?
  • COMPONENT 参数允许您将包拆分为多个组件。你有没有在 Linux 发行版中看到过类似 libfoolibfoo-devlibfoo-doc 的东西? CMake 网站上有更多文档,这里:cmake.org/cmake/help/latest/command/install.html
【解决方案2】:

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

假设您将公共*.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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多