INCLUDE_DIRECTORIES cmake
时间: 2024-04-16 11:23:13 浏览: 74
在CMake中,INCLUDE_DIRECTORIES是一个用于指定包含目录的命令。它用于告诉CMake编译器在哪里查找头文件。
使用INCLUDE_DIRECTORIES命令,你可以将一个或多个目录添加到编译器的搜索路径中。这样,当编译器在编译源文件时遇到#include语句时,它会在这些目录中查找相应的头文件。
以下是INCLUDE_DIRECTORIES命令的使用示例:
```
INCLUDE_DIRECTORIES(directory1 directory2 ...)
```
其中,directory1、directory2等是要添加到搜索路径中的目录。
相关问题
在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 Error at data-plane/suricata-3.0/src/CMakeLists.txt:686 (TARGET_LINK_LIBRARIES): IMPORTED library can only be used with the INTERFACE keyword of target_link_libraries CMake Error at data-plane/suricata-3.0/src/CMakeLists.txt:687 (target_include_directories): target_include_directories may only set INTERFACE properties on IMPORTED targets
这个错误提示的意思是,在 `data-plane/suricata-3.0/src/CMakeLists.txt` 文件的第 686 行,使用了 `TARGET_LINK_LIBRARIES` 命令指定了一个 `IMPORTED` 库进行链接。然而,`IMPORTED` 库只能和 `INTERFACE` 关键字一起使用,而不能直接和 `TARGET_LINK_LIBRARIES` 命令一起使用。在第 687 行,使用了 `target_include_directories` 命令对一个 `IMPORTED` 目标设置了 `INTERFACE` 属性,然而这也是不正确的。
要解决这个问题,可以将 `TARGET_LINK_LIBRARIES` 命令改为使用 `INTERFACE` 关键字。例如:
```
target_link_libraries(your_target_name INTERFACE imported_library_name)
```
另外,对于 `IMPORTED` 目标,应该使用 `INTERFACE` 属性来设置其包含目录。例如:
```
set_target_properties(imported_library_name PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "/path/to/include/dir")
```
注意,这里需要将 `IMPORTED` 目标的名称替换为你实际使用的目标名称,以及将 `/path/to/include/dir` 替换为实际的包含目录路径。
阅读全文