CMake target_include_directories范围的含义

Poo*_*rna 71 cmake

什么是关键词的含义PUBLIC,PRIVATE以及INTERFACE相关的CMake的target_include_directories

TMa*_*nte 85

这些关键字用于指示何时需要传递给目标的包含目录列表.到什么时候,这意味着是否需要那些包含目录:

  • 编译该目标本身.
  • 编译依赖于该目标的其他目标(例如使用其公共头文件).
  • 在上述两种情况中.

当CMake的是编译一个目标,它使用目标INCLUDE_DIRECTORIES,COMPILE_DEFINITIONSCOMPILE_OPTIONS性能.当您使用PRIVATE关键字in target_include_directories()和类似时,您告诉CMake填充这些目标属性.

当CMake检测到目标A与另一个目标B之间存在依赖关系时(如使用该target_link_libraries(A B)命令时),它会将B 使用要求传递到A目标.这些目标使用要求 是包含目录,编译定义等,任何依赖的目标B必须满足.它们由INTERFACE_*上面列出的属性版本(如INTERFACE_INCLUDE_DIRECTORIES)指定,并INTERFACE在调用target_*()命令时使用关键字填充.

PUBLIC关键字大致装置PRIVATE + INTERFACE.

因此,假设您正在创建一个A使用某些Boost标头的库.你会这样做:

  • target_include_directories(A PRIVATE ${Boost_INCLUDE_DIRS})如果你只在源文件(.cpp)或私有头文件(.h)中使用那些Boost头.
  • target_include_directories(A INTERFACE ${Boost_INCLUDE_DIRS})如果您不在源文件中使用这些Boost标头(因此,不需要它们进行编译A).我实际上无法想到一个现实世界的例子.
  • target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS})如果你在公共头文件中使用那些Boost头文件,这些头文件包含在某些A源文件中,并且也可能包含在A库的任何其他客户端中.

CMake 3.0文档提供了有关此构建规范和使用要求属性的更多详细信息.

  • 关于“ INTERFACE”的真实示例。target_include_directories(libname接口包括PRIVATE include / libname)。这意味着您可以在库中直接包含文件,但是作为库用户,您必须先插入`libname /`。 (4认同)
  • 这个答案对于我创建库来说很有意义。但是,如何为可执行文件的目标调用 target_include_directories 呢? (2认同)

usr*_*567 11

INTERFACE,PUBLIC和PRIVATE关键字需要指定以下参数的范围.PRIVATE和PUBLIC项将填充<target>的INCLUDE_DIRECTORIES属性.PUBLIC和INTERFACE项将填充<target>的INTERFACE_INCLUDE_DIRECTORIES属性.以下参数指定包含目录.

从文档:http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html

用我自己的话来改写文档:

  • 您想要将目录添加到目标的包含目录列表中
  • 使用PRIVATE,目录将添加到目标的include目录中
  • 使用INTERFACE时,目标不会被修改,但INTERFACE_INCLUDE_DIRECTORIES会被目录扩展.该变量是库的公共包含目录列表.
  • 使用PUBLIC执行来自PRIVATE和INTERFACE的操作.

  • 我浏览了CMAKE文档,但我仍然没有得到它们实际意味着什么以及在什么情况下(制作文件或如何编译)? (4认同)
  • @usr1234567 如果我们不指定关键字的“默认值”是什么?我看到很多项目只使用“target_link_libraries”或“target_include_directories”,而不指定“PRIVATE”、“PUBLIC”或“INTERFACE”关键字。 (2认同)