cmake 使用 PUBLIC_HEADER 将库和开发文件安装为单独的组件

标签 cmake

我希望创建两个包,一个包含共享库,另一个包含供开发使用的头文件。

一个有效的解决方案是:

INSTALL(TARGETS mylib
  COMPONENT core
  LIBRARY DESTINATION ${LIBDIR}
)
INSTALL (
    DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMPONENT devel
    DESTINATION ${INCLUDEDIR}
    FILES_MATCHING PATTERN "*.h")

然而,CMake 也有一个“PUBLIC_HEADER”目的地。
这样您就可以执行以下操作:
INSTALL(TARGETS mylib
  LIBRARY DESTINATION ${LIBDIR}
  PUBLIC_HEADER DESTINATION ${INCLUDEDIR}
)

我似乎无法让它发挥作用。即使头文件显式添加到 ADD_LIBRARY() 中,也不会向 ${INCLUDEDIR} 安装任何内容。有人可以指出一个应该如何工作的例子吗?

另一个问题是我想要不同包中的库和头文件,所以理想情况下我想要:
INSTALL(TARGETS mylib
  COMPONENT core
  LIBRARY DESTINATION ${LIBDIR}
)
INSTALL(TARGETS mylib
  COMPONENT devel
  PUBLIC_HEADER DESTINATION ${INCLUDEDIR}
)

但是 PUBLIC_HEADER 似乎需要设置 LIBRARY DESTINATION。
有没有办法做到这一点?
PUBLIC_HEADER 比 install DIRECTORY 有什么优势吗?

最佳答案

您必须实际设置 PUBLIC_HEADER您图书馆的属性才能使其正常工作。
我将标题放入 include/mylib所以他们在自己的“命名空间”中以避免冲突。
像这样做:

# initializes ${CMAKE_INSTALL_*DIR} to sane defaults
include(GNUInstallDirs)

add_library(
    mylib
    src/src1.cpp src/src2.cpp
    include/mylib/header1.h include/mylib/header2.h
)

# this needs to be a list, so a ; separated string in cmake
set_target_properties(mylib PROPERTIES PUBLIC_HEADER "include/header1.h;include/header2.h")

# headers are now installed to ${CMAKE_INSTALL_PREFIX}/include/mylib, and
# library into ${CMAKE_INSTALL_PREFIX}/lib or ${CMAKE_INSTALL_PREFIX}/lib64 depending on arch
install(
    TARGETS mylib
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mylib
)
你可以通过创建一个像这样的变量来绕过列表的有点丑陋的设置:
set(MYLIB_HEADERS include/mylib/header1.h include/mylib/header2.h)
set_target_properties(mylib PROPERTIES PUBLIC_HEADER "${MYLIB_HEADERS}")
文档:
  • https://cmake.org/cmake/help/v3.0/module/GNUInstallDirs.html
  • https://cmake.org/cmake/help/latest/prop_tgt/PUBLIC_HEADER.html
  • 关于cmake 使用 PUBLIC_HEADER 将库和开发文件安装为单独的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46713143/

    相关文章:

    linux - ccmake。与 ccmake [路径]

    ubuntu - 在 Ubuntu 中安装 .cmake 扩展文件的位置是什么?

    铿锵错误: linker command failed with exit code 1104

    c++ - Nextcloud 桌面客户端构建过程

    c++ - 检查包含/库路径变量(如 OpenCV_LIBS)在 unix 中指向的位置

    cmake - CMake 占位符如何工作?

    linux - 编译遗迹库(适用于 msp430)

    c++ - CMake 生成的 Ninja 项目在使用 GCC 编译时失败

    c++ - 创建柯南 test_package 配方

    c++ - CMake "clang++ is not able compile a simple test program"(软呢帽 20)