include_directorie和target_include_directorie的区别
时间: 2023-12-29 09:45:31 浏览: 28
`include_directories` 和 `target_include_directories` 都是用来指定头文件包含路径的 CMake 命令,但它们的作用范围有所不同。
`include_directories` 命令是全局命令,用于指定整个工程的头文件包含路径,它会影响到整个工程的所有目标。例如:
```cmake
include_directories(include)
```
这个命令会将 `include` 目录添加到整个工程的头文件包含路径中。
而 `target_include_directories` 命令是用于指定某个目标的头文件包含路径,它只会影响到指定的目标。例如:
```cmake
add_library(my_lib my_lib.cpp)
target_include_directories(my_lib PUBLIC include)
```
这个命令会将 `include` 目录添加到 `my_lib` 目标的头文件包含路径中。
总的来说,`include_directories` 命令适用于整个工程的头文件包含路径的设置,而 `target_include_directories` 命令适用于某个具体目标的头文件包含路径的设置。
相关问题
include_directories和target_include_directorie两者的区别
`include_directories` 和 `target_include_directories` 都是用于指定头文件的搜索路径,但是它们的作用范围不同。
`include_directories` 是用来指定全局的头文件搜索路径,它会影响到所有的目标(包括库和可执行文件)。它的语法如下:
```cmake
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
```
其中 `AFTER|BEFORE` 表示添加路径的位置,`SYSTEM` 表示将路径视为系统路径(此时会禁用一些警告),`dir1`、`dir2` 等表示需要添加的路径。
而 `target_include_directories` 则是在目标级别上指定头文件搜索路径,它只会影响到当前目标。它的语法如下:
```cmake
target_include_directories(target-name [SYSTEM] [BEFORE|AFTER]
<INTERFACE|PUBLIC|PRIVATE> [items1...])
```
其中 `target-name` 表示目标名称,`SYSTEM` 和 `BEFORE|AFTER` 的含义同上,`INTERFACE|PUBLIC|PRIVATE` 则表示不同作用域。`INTERFACE` 表示只会影响到当前目标的依赖项,`PUBLIC` 则表示会影响到当前目标和依赖它的目标,`PRIVATE` 则表示只会影响到当前目标本身。
总之,`include_directories` 是全局的设置,而 `target_include_directories` 则是在目标级别上设置的,作用范围更加精细。
target_link_libraries和target_include_directorie的区别
`target_link_libraries` 和 `target_include_directories` 是 CMake 中用于指定链接库和包含目录的命令。
`target_link_libraries` 用于将库链接到目标文件中,例如:
```cmake
target_link_libraries(my_target PRIVATE my_library)
```
这将在 `my_target` 目标文件中链接 `my_library` 库。可以使用 `PUBLIC` 或 `INTERFACE` 关键字将库链接到目标文件的接口中,以便该库的依赖项也可用于其他目标文件。
`target_include_directories` 用于将包含目录添加到目标文件中,例如:
```cmake
target_include_directories(my_target PRIVATE ${CMAKE_SOURCE_DIR}/include)
```
这将在 `my_target` 目标文件中添加 `CMAKE_SOURCE_DIR/include` 目录作为包含目录。同样可以使用 `PUBLIC` 或 `INTERFACE` 关键字将包含目录添加到目标文件的接口中。
总的来说,`target_link_libraries` 用于指定链接的库,而 `target_include_directories` 用于指定包含的目录。