Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake target_include_目录范围的含义_Cmake - Fatal编程技术网

CMake target_include_目录范围的含义

CMake target_include_目录范围的含义,cmake,Cmake,与CMake的target\u include\u目录相关的关键字PUBLIC、PRIVATE和INTERFACE的含义是什么 需要使用接口、公共和私有关键字来指定 以下参数的范围。私人和公共物品将 填充的INCLUDE\u DIRECTORIES属性。公共和 接口项将填充接口包含目录 的属性。以下参数指定了include 目录 从文件中: 用我自己的话重新表述文档: 您想将目录添加到目标的包含目录列表中 使用PRIVATE,目录将添加到目标的include目录中 使用INTERFACE时,不会

与CMake的target\u include\u目录相关的关键字PUBLIC、PRIVATE和INTERFACE的含义是什么

需要使用接口、公共和私有关键字来指定 以下参数的范围。私人和公共物品将 填充的INCLUDE\u DIRECTORIES属性。公共和 接口项将填充接口包含目录 的属性。以下参数指定了include 目录

从文件中:

用我自己的话重新表述文档:

您想将目录添加到目标的包含目录列表中 使用PRIVATE,目录将添加到目标的include目录中 使用INTERFACE时,不会修改目标,但INTERFACE_INCLUDE_目录由目录扩展。变量是库的公共包含目录列表。 对于PUBLIC,将执行来自PRIVATE和INTERFACE的操作。
这些关键字用于告诉何时需要传递给目标的include目录列表。按时间,这意味着如果需要这些包含目录:

编译该目标本身。 编译依赖于该目标的其他目标,如使用其公共头。 在上述两种情况下。 当CMake编译一个目标时,它使用目标INCLUDE_目录、COMPILE_定义和COMPILE_选项属性。当您在target_include_目录和类似目录中使用PRIVATE关键字时,您会告诉CMake填充这些目标属性

当CMake检测到一个目标a和另一个目标B之间的依赖关系时(如使用target_link_librariesA B命令时),它会将B的使用要求传递给a目标。这些目标使用要求包括目录、编译定义等,依赖于B的任何目标都必须满足这些要求。它们由上面列出的属性(如INTERFACE_INCLUDE_目录)的INTERFACE_*版本指定,并在调用target_*命令时使用INTERFACE关键字填充

PUBLIC关键字大致表示PRIVATE+接口

因此,假设您正在创建一个使用一些Boost头的库a。你会做:

如果只在源文件.cpp或私有头文件.h中使用这些Boost头文件,则target_include_directoriesA PRIVATE${Boost_include_DIRS}。 target_include_directoriesA INTERFACE${Boost_include_DIRS}如果您不在源文件中使用这些Boost头文件,那么就不需要它们来编译。我实际上想不出一个真实的例子。 target_include_directoriesA PUBLIC${Boost_include_DIRS}如果您在公共头文件中使用这些Boost头文件,这些头文件既包含在A的某些源文件中,也可能包含在A库的任何其他客户端中。
CMake 3.0文档提供了有关此属性的更多详细信息。

我浏览了CMake文档,但仍然没有了解它们的真正含义、在什么上下文中生成文件或它们是如何编译的?@Sirish:我试图重新表述文档,希望有帮助。@usr1234567如果我们不指定关键字的默认值是多少?我看到很多项目只使用target\u link\u库或target\u include\u目录,而没有指定PRIVATE、PUBLIC或INTERFACE关键字。@IgNite请参阅最后一段的第二段。这很复杂:-密切相关:关于一个真实的界面示例。目标包含目录名接口包含私有包含/libname。这意味着您可以在库中直接包含文件,但作为库的用户,您必须首先插入libname/这对我创建库很有意义。但是,对于可执行目标调用target_include_目录怎么样?@NormanPellet:如果需要设置可执行目标使用的头文件所在的include目录,您可以为可执行目标调用target_include_目录,例如:Boost::Program_options,如果您使用它来解析主函数中的参数。在本例中,您可能会使用PRIVATE关键字,因为编译可执行文件本身需要这些文件。不过,我不知道在可执行文件上是否有接口或公共的用途。