我试图理解一个人可以在target_include_directories
中指定的范围之间的区别,特别是PRIVATE
和INTERFACE
。该文档说(特定的上下文是 header only库):
需要INTERFACE,PUBLIC和PRIVATE关键字来指定 以下参数的范围。私人和公共物品 填充的INCLUDE_DIRECTORIES属性。公共和 INTERFACE项目将填充INTERFACE_INCLUDE_DIRECTORIES 的属性。 (导入的目标仅支持INTERFACE项目。) 以下参数指定包含目录。
因此,基本上使用PRIVATE
或INTERFACE
都会修改INCLUDE_DIRECTORIES
或INTERFACE_INCLUDE_DIRECTORIES
。我确实很难理解两者之间的区别。根据文档中的描述,INCLUDE_DIRECTORIES
似乎是编译C ++项目时标志-I
的参数。
我完全不理解后者,任何人都可以澄清吗?
显然,在仅使用标头的库中使用INTERFACE
更好,为什么?
答案 0 :(得分:1)
接口目标仅用于标头库。声明此类目标不会在编译时产生任何内容(CMake不会生成规则来为这些目标产生对象,可执行文件或库)。
因此,CMake需要区分标头,这些标头将用于编译产生对象的目标。
我记得,这2个属性的主要用途如下:(请注意,我并不是对所有事情都100%肯定)。
可执行目标
INCLUDE_DIRECTORIES
属性,并为此目录编译文件所需的目录列表INTERFACE_INCLUDE_DIRECTORIES
,因为其他目标不能依赖于可执行目标(我不确定)库目标
INCLUDE_DIRECTORIES
属性,并为此目录编译文件所需的目录列表INTERFACE_INCLUDE_DIRECTORIES
设置一个目录列表,以编译依赖于该目标的其他目标所需的目录接口目标
INCLUDE_DIRECTORIES
属性,因为它永远不会被编译INTERFACE_INCLUDE_DIRECTORIES
是因为它仅包含头文件,因此依赖的其他目标将需要包括这些头文件由于这是一个棘手的问题,并且很多人都在问这个问题,所以我会尽快将其变成社区答案,因此通过迭代改进,我们有望找到一种正确解释这一点的方法。