target_include_directories 中 PUBLIC参数是什么意思 举例说明
时间: 2023-07-21 07:04:52 浏览: 90
在 CMake 构建系统中,target_include_directories 用于设置目标可访问的头文件路径。其中,PUBLIC 参数表示这些路径将不仅仅对当前目标可见,而且还会传递到使用当前目标的其他目标中。换句话说,如果一个目标 A 依赖于另一个目标 B,并且 B 在其 target_include_directories 中设置了 PUBLIC 参数,那么 A 也能够访问 B 中设置的头文件路径。
以下是一个示例:
```cmake
# 设置一个库的头文件路径
target_include_directories(my_lib PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)
# 在另一个目标中使用该库
add_executable(my_app main.cpp)
target_link_libraries(my_app PRIVATE my_lib)
```
在上面的示例中,my_lib 库设置了 PUBLIC 参数,因此 my_app 可以访问 my_lib 中的头文件路径。这意味着在 my_app 的源文件中,可以直接包含 my_lib 中的头文件,例如:
```cpp
#include <my_lib/my_header.h>
```
需要注意的是,PUBLIC 参数只是一种传递头文件路径的方式,还可以使用 INTERFACE 参数和 PRIVATE 参数来控制头文件路径的可见性。
相关问题
target_include_directories 中 PUBLIC参数是什么意思
`target_include_directories()` 函数是用来指定目标库或可执行文件的头文件搜索路径的。该函数中的第二个参数可以是 `PUBLIC`、`PRIVATE` 或 `INTERFACE`,这些参数可以控制头文件路径的可见性。
- `PUBLIC`:表示该头文件路径不仅适用于当前目标,也适用于依赖于当前目标的其他目标。
- `PRIVATE`:表示该头文件路径仅适用于当前目标,不适用于依赖于当前目标的其他目标。
- `INTERFACE`:表示该头文件路径仅适用于依赖于当前目标的其他目标,而不适用于当前目标本身。
因此,如果你想让某个头文件路径既适用于当前目标,又适用于依赖于当前目标的其他目标,那么应该使用 `PUBLIC` 参数。
在cmake中执行target_include_directories(mylib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) target_include_directories(mylib_shared PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include )提醒正确,执行target_include_directories(mylib mylib_shared PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include )时提醒错误 target_include_directories called with invalid arguments
执行 `target_include_directories(mylib mylib_shared PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)` 时,会出现 "target_include_directories called with invalid arguments" 的错误提示,这是因为 `target_include_directories()` 函数不支持一次为多个目标添加头文件搜索路径。
如果想要为多个目标设置相同的头文件搜索路径,需要分别为每个目标调用 `target_include_directories()` 函数。例如,下面的代码将 `${CMAKE_CURRENT_SOURCE_DIR}/include` 目录添加到 `mylib` 和 `mylib_shared` 两个目标的头文件搜索路径中:
```
target_include_directories(mylib
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_include_directories(mylib_shared
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)
```
这样,这两个目标的依赖项就可以使用这些路径了。
需要注意的是,如果要使用不同的可见性(即 `INTERFACE`、`PUBLIC` 或 `PRIVATE`)为不同的目标添加头文件路径,需要为每个目标分别调用 `target_include_directories()` 函数,并指定相应的可见性。例如:
```
target_include_directories(mylib
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)
target_include_directories(mylib_shared
INTERFACE
/usr/local/include
)
```
这样,`mylib` 目标的头文件路径对其依赖项可见,而 `mylib_shared` 目标的头文件路径对其依赖项不可见,但对其接口(即 `INTERFACE`)可见。
阅读全文