In CMake, include_directories and add_subdirectory are two very commonly used but functionally distinct commands. Here are the main differences and purposes of these two commands:
1. include_directories
This command adds header file search paths to the project. It instructs the compiler to search for header files in specified directories during compilation. This is global for all targets in the project unless explicitly scoped.
Example:
Suppose you have a project with shared header files located in the include directory. You can add this to the search path using the following command:
cmakeinclude_directories(${CMAKE_SOURCE_DIR}/include)
This way, CMake will automatically search for required header files in the include directory during compilation.
2. add_subdirectory
The add_subdirectory command adds subdirectories to the current project, which must contain their own CMakeLists.txt file. This is useful for breaking down large projects into smaller, more manageable modules. When executing add_subdirectory, CMake enters the specified subdirectory, executes its CMakeLists.txt, and allows the build to include targets defined there.
Example:
Suppose your project structure includes a directory named lib containing library code and its own CMakeLists.txt file. You can add it to the main project using the following command:
cmakeadd_subdirectory(lib)
This will cause all targets defined in the lib directory (such as libraries) to be built and can be used by other parts of the project.
Summary
In short, include_directories is used to add header file search paths so the compiler can locate these headers, while add_subdirectory is used to add subdirectories containing their own CMakeLists.txt files, which may define build targets (such as libraries or executables). Both are indispensable tools for project organization, but their purposes and impacts are fundamentally different.