我真的需要指定安装接口包含依赖项吗?



在我的一个包中,我目前有:

include(GNUInstallDirs)
target_include_directories(
mylib
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> # ***
)

以及:

install(
TARGETS mylib
EXPORT mylib
RUNTIME DESTINATION  "${CMAKE_INSTALL_BINDIR}"
ARCHIVE DESTINATION  "${CMAKE_INSTALL_LIBDIR}"
LIBRARY DESTINATION  "${CMAKE_INSTALL_LIBDIR}"
INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" 
)
install(
EXPORT mylib
FILE "mylib-config.cmake"
NAMESPACE mylib::
DESTINATION "lib/cmake/mylib" )

我注意到在已安装的config.cmake文件中,我两次看到包含目录:

set_target_properties(mylib::mylib PROPERTIES
# etc. etc.
INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${_IMPORT_PREFIX}/include"
)

因此,作为实验,我删除了上面标记为***的行 - 配置文件现在只有一次包含目录。

那么,这样做安全吗?也就是说,如果我使用 INCLUDE 参数安装目标,我真的不需要指定安装接口包含目录吗?或者 - 我错过了什么吗?

文档明确指出,target_include_directories带有非PRIVATE关键字的命令和 INCLUDE DESTINATION子句install命令填充INTERFACE_INCLUDE_DIRECTORIES属性。

使用哪种方法取决于您。

请注意,同一目标可以安装多次。target_include_directories影响所有安装,但"包括目标"仅影响特定安装。


包含目标子句的文档:

此选项指定目录列表,当由install(EXPORT)命令导出时,该目录将添加到<targets>INTERFACE_INCLUDE_DIRECTORIES目标属性中。如果指定了相对路径,则将其视为相对于$<INSTALL_PREFIX>

target_include_directories文档:

PUBLICINTERFACE项将填充<target>INTERFACE_INCLUDE_DIRECTORIES属性。

最新更新