我的C++代码有一个目录结构,如下所示:
| |->include |->src
我正在为我的代码编写一个CMakeLists.txt文件。我想了解include_directories和CMake中的target_include_directories之间的区别。它们的用法和为了添加包含文件路径,我应该使用哪一个有什么区别?
include_directories
CMake
target_include_directories
8cdiaqws1#
include_directories(x/y)影响目录范围。此CMakeList中的所有目标以及在其调用点之后添加的所有子目录中的目标都将在其包含路径中添加路径x/y。target_include_directories(t x/y)具有目标作用域-它将x/y添加到目标t的包含路径中。如果所有的目标都使用所讨论的include目录,则需要前一个。如果路径特定于某个目标,或者如果您希望更好地控制路径的可见性,则需要后一个。后一个是因为target_include_directories()支持PRIVATE,PUBLIC和INTERFACE限定符。
include_directories(x/y)
x/y
target_include_directories(t x/y)
t
target_include_directories()
PRIVATE
PUBLIC
INTERFACE
lp0sw83n2#
除了Angew's answer正确表达的内容之外,include_directories和target_include_directories之间的另一个非常重要的区别是,当与PUBLIC或INTERFACE一起使用时,后者填充目标的INTERFACE_INCLUDE_DIRECTORIES属性。因为链接目标将自动添加这些包含目录。请参阅example。这个重要的特性隐藏在文档中:target_include_directories提到了填充INTERFACE_INCLUDE_DIRECTORIES,其documentation表示:当使用target_link_libraries()指定目标依赖项时,CMake将从所有目标依赖项中读取此属性,以确定使用者的生成属性。
INTERFACE_INCLUDE_DIRECTORIES
oaxa6hgo3#
正如@Angew所说,两者的区别在于:1,include_directories()对于源树中的所有文件都是可访问的2,target_include_directories()在编译时仅对于特定的目标是可访问的。
3条答案
按热度按时间8cdiaqws1#
include_directories(x/y)
影响目录范围。此CMakeList中的所有目标以及在其调用点之后添加的所有子目录中的目标都将在其包含路径中添加路径x/y
。target_include_directories(t x/y)
具有目标作用域-它将x/y
添加到目标t
的包含路径中。如果所有的目标都使用所讨论的include目录,则需要前一个。如果路径特定于某个目标,或者如果您希望更好地控制路径的可见性,则需要后一个。后一个是因为
target_include_directories()
支持PRIVATE
,PUBLIC
和INTERFACE
限定符。lp0sw83n2#
除了Angew's answer正确表达的内容之外,
include_directories
和target_include_directories
之间的另一个非常重要的区别是,当与PUBLIC
或INTERFACE
一起使用时,后者填充目标的INTERFACE_INCLUDE_DIRECTORIES
属性。因为链接目标将自动添加这些包含目录。请参阅example。这个重要的特性隐藏在文档中:target_include_directories提到了填充
INTERFACE_INCLUDE_DIRECTORIES
,其documentation表示:当使用target_link_libraries()指定目标依赖项时,CMake将从所有目标依赖项中读取此属性,以确定使用者的生成属性。
oaxa6hgo3#
正如@Angew所说,两者的区别在于:
1,include_directories()对于源树中的所有文件都是可访问的2,target_include_directories()在编译时仅对于特定的目标是可访问的。