CMake target_include_directories范围的含义

时间:2014-10-07 18:53:50

标签: cmake

与CMake PUBLIC相关的关键字PRIVATEINTERFACEtarget_include_directories的含义是什么?

2 个答案:

答案 0 :(得分:68)

这些关键字用于告知何时您需要传递给目标的包含目录列表。通过,这意味着是否需要包含这些目录:

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

当CMake正在编译目标时,它会使用目标INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_OPTIONS属性。当您在PRIVATE中使用target_include_directories()关键字时,您可以告诉CMake填充这些目标属性。

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

target_*()关键字大致意为PUBLIC

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

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

CMake 3.0文档提供了有关此build specification and usage requirements属性的更多详细信息。

答案 1 :(得分:10)

  

INTERFACE,PUBLIC和PRIVATE关键字需要指定   以下参数的范围。 PRIVATE和PUBLIC项目将   填充<的INCLUDE_DIRECTORIES属性目标>。公共和   INTERFACE项目将填充INTERFACE_INCLUDE_DIRECTORIES   <财产目标>。以下参数指定include   目录。

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

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

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