CMake中的include_directories和target_include_directories之间有什么区别?

fkvaft9z  于 2022-11-11  发布在  其他
关注(0)|答案(3)|浏览(380)

我的C++代码有一个目录结构,如下所示:

|
|->include
|->src

我正在为我的代码编写一个CMakeLists.txt文件。我想了解include_directoriesCMake中的target_include_directories之间的区别。
它们的用法和为了添加包含文件路径,我应该使用哪一个有什么区别?

8cdiaqws

8cdiaqws1#

include_directories(x/y)影响目录范围。此CMakeList中的所有目标以及在其调用点之后添加的所有子目录中的目标都将在其包含路径中添加路径x/y
target_include_directories(t x/y)具有目标作用域-它将x/y添加到目标t的包含路径中。
如果所有的目标都使用所讨论的include目录,则需要前一个。如果路径特定于某个目标,或者如果您希望更好地控制路径的可见性,则需要后一个。后一个是因为target_include_directories()支持PRIVATEPUBLICINTERFACE限定符。

lp0sw83n

lp0sw83n2#

除了Angew's answer正确表达的内容之外,include_directoriestarget_include_directories之间的另一个非常重要的区别是,当与PUBLICINTERFACE一起使用时,后者填充目标的INTERFACE_INCLUDE_DIRECTORIES属性。因为链接目标将自动添加这些包含目录。请参阅example
这个重要的特性隐藏在文档中:target_include_directories提到了填充INTERFACE_INCLUDE_DIRECTORIES,其documentation表示:
当使用target_link_libraries()指定目标依赖项时,CMake将从所有目标依赖项中读取此属性,以确定使用者的生成属性。

oaxa6hgo

oaxa6hgo3#

正如@Angew所说,两者的区别在于:
1,include_directories()对于源树中的所有文件都是可访问的2,target_include_directories()在编译时仅对于特定的目标是可访问的。

相关问题