请详细说明cmake中的add_subdirectory()函数
时间: 2024-04-06 10:34:49 浏览: 249
add_subdirectory()函数是CMake的一个内置指令,用于向CMake项目中添加子目录。当调用该函数时,CMake会在指定的子目录中查找CMakeLists.txt文件,并在该子目录中执行CMake构建过程。
add_subdirectory()函数的语法如下:
add_subdirectory(directory [binary_dir] [EXCLUDE_FROM_ALL])
其中:
- directory:必选参数,指定要添加的子目录名称。
- binary_dir:可选参数,指定子目录的二进制目录,如果未指定,则默认为当前构建目录。
- EXCLUDE_FROM_ALL:可选参数,指定是否将子目录从ALL构建目标中排除,默认为不排除。
在使用add_subdirectory()函数时,需要注意以下几点:
- 子目录必须是CMakeLists.txt所在的目录,不能是其他文件。
- 子目录中定义的变量不会影响父目录中的变量。
- 子目录中定义的target(包括库和可执行文件)可以在父目录中使用。
- 如果子目录中使用了变量,则需要在父目录中定义这些变量。
- 如果父目录中使用了子目录中的target,则需要在父目录中使用target_link_libraries()函数来链接子目录中的库。
总之,add_subdirectory()函数是CMake项目中非常有用的一个函数,它可以帮助我们更好地组织和管理项目结构。
相关问题
cmake中的add_subdirectory()函数, 请举例说明怎么使用
当我们需要在CMake项目中添加子目录时,可以使用add_subdirectory()函数。下面是一个简单的例子,演示了如何使用add_subdirectory()函数来添加一个子目录。
假设我们的项目结构如下:
```
project/
├── CMakeLists.txt
├── main.cpp
└── subdirectory/
├── CMakeLists.txt
└── sub.cpp
```
其中,project目录是我们的顶级目录,包含了顶层CMakeLists.txt文件和main.cpp文件。subdirectory目录是我们要添加的子目录,包含了sub.cpp文件和子目录级别的CMakeLists.txt文件。
现在,我们要在顶层CMakeLists.txt文件中添加subdirectory子目录。我们可以在顶层CMakeLists.txt文件中添加如下代码:
```
cmake_minimum_required(VERSION 3.5)
project(MyProject)
add_subdirectory(subdirectory)
add_executable(MyProject main.cpp)
target_link_libraries(MyProject sub)
```
在上面的代码中,我们首先指定了CMake的最低版本,然后定义了项目名称为MyProject。接着,我们调用了add_subdirectory()函数,指定了子目录为subdirectory。注意,这里的subdirectory是相对于顶层目录的路径。最后,我们定义了一个可执行文件MyProject,并链接了子目录中的库sub。
接着,我们可以在子目录中的CMakeLists.txt文件中定义一个库sub。我们可以在子目录的CMakeLists.txt文件中添加如下代码:
```
add_library(sub STATIC sub.cpp)
```
在上面的代码中,我们定义了一个名为sub的静态库,其中包含了一个源文件sub.cpp。
通过这样的方式,我们就成功地将一个子目录添加到了CMake项目中,并且在顶层目录中可以使用子目录中定义的库。
# toplevel CMakeLists.txt for a catkin workspace # catkin/cmake/toplevel.cmake cmake_minimum_required(VERSION 3.0.2) project(Project) set(CATKIN_TOPLEVEL TRUE) # search for catkin within the workspace set(_cmd "catkin_find_pkg" "catkin" "${CMAKE_SOURCE_DIR}") execute_process(COMMAND ${_cmd} RESULT_VARIABLE _res OUTPUT_VARIABLE _out ERROR_VARIABLE _err OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_STRIP_TRAILING_WHITESPACE ) if(NOT _res EQUAL 0 AND NOT _res EQUAL 2) # searching fot catkin resulted in an error string(REPLACE ";" " " _cmd_str "${_cmd}") message(FATAL_ERROR "Search for 'catkin' in workspace failed (${_cmd_str}): ${_err}") endif() # include catkin from workspace or via find_package() if(_res EQUAL 0) set(catkin_EXTRAS_DIR "${CMAKE_SOURCE_DIR}/${_out}/cmake") # include all.cmake without add_subdirectory to let it operate in same scope include(${catkin_EXTRAS_DIR}/all.cmake NO_POLICY_SCOPE) add_subdirectory("${_out}") else() # use either CMAKE_PREFIX_PATH explicitly passed to CMake as a command line argument # or CMAKE_PREFIX_PATH from the environment if(NOT DEFINED CMAKE_PREFIX_PATH) if(NOT "$ENV{CMAKE_PREFIX_PATH}" STREQUAL "") if(NOT WIN32) string(REPLACE ":" ";" CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH}) else() set(CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH}) endif() endif() endif() # list of catkin workspaces set(catkin_search_path "") foreach(path ${CMAKE_PREFIX_PATH}) if(EXISTS "${path}/.catkin") list(FIND catkin_search_path ${path} _index) if(_index EQUAL -1) list(APPEND catkin_search_path ${path}) endif() endif() endforeach() # search for catkin in all workspaces set(CATKIN_TOPLEVEL_FIND_PACKAGE TRUE) find_package(catkin QUIET NO_POLICY_SCOPE PATHS ${catkin_search_path} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) unset(CATKIN_TOPLEVEL_FIND_PACKAGE) if(NOT catkin_FOUND) message(FATAL_ERROR "find_package(catkin) failed. catkin was neither found in the workspace nor in the CMAKE_PREFIX_PATH. One reason may be that no ROS setup.sh was sourced before.") endif() endif() catkin_workspace()
根据您提供的 CMakeLists.txt 文件,这是一个用于构建 catkin 工作空间的顶层 CMakeLists.txt 文件。该文件负责搜索并包含 catkin 软件包。
首先,它尝试在工作空间内搜索并包含 catkin 软件包。如果成功找到并包含了 catkin 软件包,则会添加子目录并编译该软件包。
如果在工作空间内未找到 catkin 软件包,则会尝试使用 CMAKE_PREFIX_PATH 环境变量或作为命令行参数传递给 CMake 的 CMAKE_PREFIX_PATH 变量来搜索 catkin。它会在 CMAKE_PREFIX_PATH 中搜索所有可能的 catkin 工作空间,并尝试找到 catkin 软件包。
如果仍然无法找到 catkin 软件包,则会输出错误消息。
此外,它还调用了 `catkin_workspace()` 函数,用于标记当前目录为 catkin 工作空间。
请确保您的系统中已经正确安装了 catkin,并且工作空间的目录结构和设置是正确的。如果您遇到任何问题,请提供更多详细信息,我将尽力帮助您解决问题。
阅读全文