我希望创建两个包,一个包含共享库,另一个包含供开发使用的头文件。
一个有效的解决方案是:
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}")
文档:关于cmake 使用 PUBLIC_HEADER 将库和开发文件安装为单独的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46713143/