gpt4 book ai didi

c++ - 如何配置 CMakeLists.txt 以安装共享库的公共(public) header ?

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:02 26 4
gpt4 key购买 nike

我想使用 cmake 安装我的库 edv但是当我执行时:

cmake --build . --target install

它会安装但只会创建 bin/edv.dlllib/ < empty > .如何让 cmake 安装 EDV_PUBLIC_INCLUDE_DIRECTORIESinclude/... 里面?

这是我的 CMakeLists.txt :

cmake_minimum_required(VERSION 3.12)

project(edv)

# include PUBLIC directories
set(EDV_PUBLIC_INCLUDE_DIRECTORIES include/ )

set(EDV_PRIVATE_INCLUDE_DIRECTORIES src/ )

# Edv source files list
file(GLOB_RECURSE EDV_SOURCE_FILES "src/*.cpp" "src/*.hpp*")


# build the library
add_library(${PROJECT_NAME} SHARED ${EDV_SOURCE_FILES} )

target_include_directories(${PROJECT_NAME} PUBLIC ${EDV_PUBLIC_INCLUDE_DIRECTORIES})
target_include_directories(${PROJECT_NAME} PRIVATE ${EDV_PRIVATE_INCLUDE_DIRECTORIES})

install (TARGETS ${PROJECT_NAME}
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
PUBLIC_HEADER DESTINATION include
)

最佳答案

CMake 无法从目标中推断出要安装的头文件集。这是有道理的,因为目标可能同时包含私有(private)和公共(public)头文件,但 CMake 不区分它们。因此,您必须在 INSTALL(FILES ...) 命令中明确列出头文件:

install(FILES ${MY_HEADER_FILES} DESTINATION include)

CMake 3.23 及更高版本的更新:

引入 CMake 3.23 版 File Sets ,这允许以更优雅的方式处理头文件。这样,头文件只需在 CMakeLists.txt 中列出一次,即可在 IDE 中集成并正确安装:

cmake_minimum_required(VERSION 3.23)

# example library with sources and headers located at ${MY_LIB_SOURCE_DIR}
add_library(my_lib)
target_include_directories(my_lib PUBLIC ${MY_LIB_SOURCE_DIR})

# source files get added as before
target_sources(my_lib PUBLIC ${MY_LIB_SOURCE_DIR}/my_lib/my_lib.cpp)

# header files get added via FILE_SET
# BASE_DIR should point to the same directory that is used as the
# target_include_directory, otherwise the install paths may be off.
target_sources(my_lib PUBLIC FILE_SET HEADERS
BASE_DIRS ${MY_LIB_SOURCE_DIR}
FILES ${MY_LIB_SOURCE_DIR}/my_lib/my_lib.hpp)

# install command needs to reference the file set again
install(TARGETS my_lib FILE_SET HEADERS)

3.23 更新结束

PUBLIC_HEADER您偶然发现的字段与 OSX 框架机制有关,这是它自己的蠕虫病毒。我建议你远离它,除非你真的想在 OSX 上将你的库部署为 .framework

特别注意INCLUDES DESTINATION INSTALL(TARGET ...) 命令的选项。虽然这实际上并没有复制任何文件本身,但它允许将 include 目录自动添加到配置包脚本提供的导入目标中。如果您打算向您的用户提供包配置脚本(您可能应该这样做,至少如果您希望您的用户也使用 CMake),您可能需要设置此选项。

由于整体安装机制相当复杂,我有a small github project我的网站,您可以在其中观察所有正在运行的元素。

关于c++ - 如何配置 CMakeLists.txt 以安装共享库的公共(public) header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54271925/

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