cmake使用PUBLIC_头将库文件和开发文件作为单独的组件安装
我希望创建两个包,一个包含共享库,另一个包含开发使用的头 有效的解决方案是:cmake使用PUBLIC_头将库文件和开发文件作为单独的组件安装,cmake,Cmake,我希望创建两个包,一个包含共享库,另一个包含开发使用的头 有效的解决方案是: INSTALL(TARGETS mylib COMPONENT core LIBRARY DESTINATION ${LIBDIR} ) INSTALL ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPONENT devel DESTINATION ${INCLUDEDIR} FILES_MATCHING PATTERN "*.h") 然
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比install DIRECTORY有什么优势吗?几乎肯定是错误的工具,除非您的共享库实际上是一个OSX框架库。文件中也明确指出了这一点
如果希望在安装步骤中复制头文件,则应使用:
install(FILES ${MY_PUBLIC_HEADERS} DESTINATION ${INCLUDEDIR} COMPONENT devel)
这是有意义的,因为CMake无法通过查看目标来推断您可能希望或不希望成为安装集的一部分的头。因此,手动指定文件列表确实是为安装指定头的唯一合理方法,而install(FILES…
正是这样做的
您也应该避免使用glob表达式,因为显式提供文件可能节省的时间并不能证明文件中断时会带来的麻烦。您必须实际设置库的
PUBLIC\u 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}")
通过创建如下变量,可以绕过列表中有点难看的设置:
# 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}")
文件: