CMake target_include_directories作用域的含义

dkqlctbz  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(218)

与CMake的target_include_directories相关的关键字PUBLICPRIVATEINTERFACE的含义是什么?

hxzsmxv2

hxzsmxv21#

这些关键字用于告诉何时需要传递给目标的包含目录列表。when表示是否需要这些包含目录:

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

当CMake编译一个目标时,它会使用目标的INCLUDE_DIRECTORIESCOMPILE_DEFINITIONSCOMPILE_OPTIONS属性。当你在target_include_directories()中使用PRIVATE关键字时,你会告诉CMake填充这些目标属性。
当CMake检测到目标A和另一个目标B之间的依赖关系时(就像使用target_link_libraries(A B)命令一样),它会将B * 使用要求 * 传递到A目标。这些属性由上面列出的属性的INTERFACE_*版本指定(如INTERFACE_INCLUDE_DIRECTORIES),并在调用target_*()命令时使用INTERFACE关键字填充。
关键字PUBLIC大致表示PRIVATE + INTERFACE
因此,假设您正在创建一个使用一些Boost头文件的库A,您将执行以下操作:

  • 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文档包含有关此构建规范和使用要求属性的更多详细信息。

soat7uwm

soat7uwm2#

INTERFACE、PUBLIC和PRIVATE关键字是指定下列参数的作用域所必需的。PRIVATE和PUBLIC项将填充的INCLUDE_DIRECTORIES属性< target >。PUBLIC和INTERFACE项将填充的INTERFACE_INCLUDE_DIRECTORIES属性< target >。下列参数指定包含目录。
从文档中:http://www.cmake.org/cmake/help/v3.0/command/target_include_directories.html
用我自己的话重新表述文档:

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

相关问题