如何让 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
文件复制到正确的目的地,如下所示。
- 在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,终于找到解决办法了!
假设您将 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
参数,以允许在运行时和开发包之间拆分文件(以及可能的其他文件,如文档和体系结构无关的数据文件)。
以前,我正在寻找此类问题,但其中 none 个正在作为示例
目前,我正在创建一个 C 库,它应该输出一个共享库(*.so
或 *.dll
)文件和 ./include
中的多个 *.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})
折腾了几天 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
参数,以允许在运行时和开发包之间拆分文件(以及可能的其他文件,如文档和体系结构无关的数据文件)。