c语言 - 如何要求CMake在运行"cmake install"时复制包含目录?



以前,我正在寻找这种问题,但他们都没有作为例子,这个线程和这个。

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

  • In 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})

这个答案比你的答案好:

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参数,以允许在运行时和开发包之间分割文件(以及潜在的其他文件,如文档和与体系结构无关的数据文件)。

经过几天的摆弄CMake,我终于找到了解决方案!

让我们假设您将公共*.h存储在./include目录中,那么以下是将*.h文件安装到机器的语法:

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

我从这里得到了解决方案,usr/myproject被替换为include

最新更新