CMAKE中target_include_directories命令的[INTERFACE|PUBLIC|PRIVATE]作用
时间: 2023-12-29 08:52:43 浏览: 149
在 CMake 中,`target_include_directories` 命令用于为目标添加头文件搜索路径。而 `[INTERFACE|PUBLIC|PRIVATE]` 则用于指定头文件搜索路径的可见性。
- `PUBLIC` 表示该头文件搜索路径不仅适用于当前目标,也适用于该目标链接的其他目标。
- `PRIVATE` 表示该头文件搜索路径只适用于当前目标,不适用于链接到该目标的其他目标。
- `INTERFACE` 表示该头文件搜索路径只适用于链接到该目标的其他目标,不适用于当前目标本身。
这三个修饰符可以组合使用,以指定不同的可见性。例如:
```
target_include_directories(my_target
PUBLIC ${PROJECT_SOURCE_DIR}/include
PRIVATE ${PROJECT_SOURCE_DIR}/src
INTERFACE ${PROJECT_BINARY_DIR}
)
```
其中,`my_target` 是需要添加头文件搜索路径的目标,`PROJECT_SOURCE_DIR` 和 `PROJECT_BINARY_DIR` 分别表示项目源码和构建目录的根目录。上述命令的意思是:`my_target` 可以访问 `${PROJECT_SOURCE_DIR}/include` 和 `${PROJECT_BINARY_DIR}` 中的头文件,而 `${PROJECT_SOURCE_DIR}/src` 中的头文件只能由 `my_target` 自己使用。
相关问题
在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`)可见。
cmake中target_sources用法target_link_libraries\target_include_directories\target_compile_options
在CMake中,target_sources命令用于向target添加源文件,其格式如下:
```cmake
target_sources(<target> [PRIVATE|PUBLIC|INTERFACE] [items1...]
[<PRIVATE|PUBLIC|INTERFACE> [items2...] ...])
```
这个命令可以将源文件直接添加到指定的target中。源文件可以是C、C++、Objective-C、Objective-C++等类型的文件。
例如,假设我们有一个名为myapp的目标,并且我们想将两个源文件main.cpp和helper.cpp添加到该目标中,可以使用以下代码:
```cmake
add_executable(myapp)
target_sources(myapp PRIVATE main.cpp helper.cpp)
```
target_link_libraries命令用于将目标与库文件进行链接,其格式如下:
```cmake
target_link_libraries(<target> [item1] [item2] [...])
```
这个命令可以将库文件链接到指定的target中,以便在编译和链接过程中使用这些库。
例如,假设我们有一个名为myapp的目标,并且我们想将名为mylib的库文件链接到该目标中,可以使用以下代码:
```cmake
add_executable(myapp)
target_link_libraries(myapp mylib)
```
target_include_directories命令用于向target添加包含目录,其格式如下:
```cmake
target_include_directories(<target> [SYSTEM] [BEFORE|AFTER]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
```
这个命令可以将包含目录添加到指定的target中,以便在编译过程中可以找到所需的头文件。
例如,假设我们有一个名为myapp的目标,并且我们想将名为include的目录添加到该目标的包含目录中,可以使用以下代码:
```cmake
add_executable(myapp)
target_include_directories(myapp PRIVATE include)
```
阅读全文