Cmake include_directories()
69,918
Quoting the documentation for include_directories
:
The include directories are added to the directory property INCLUDE_DIRECTORIES for the current CMakeLists file. They are also added to the target property INCLUDE_DIRECTORIES for each target in the current CMakeLists file. The target property values are the ones used by the generators.
The INCLUDE_DIRECTORIES
directory property is inherited to all subdirectories and all targets in the directory.
- Specifying
${CMAKE_CURRENT_SOURCE_DIR}
forinclude_directories
is redundant as relative paths are interpreted as relative to this directory by default. You should throw it out to increase readability. - Specifying an include directory in both a subdirectory and its parent is redundant. You should avoid this and settle on one location.
- Use
get_property
andmessage
to double-check that all directories and targets end up with the correct entries in theirINCLUDE_DIRECTORIES
property. - If you are free to require CMake 2.8.11 as a minimum requirement, consider abandoning
include_directories
completely and usetarget_include_directories
instead. This has the advantage that include dependencies get resolved on a per-target basis exclusively which is usually the more desirable behavior.
Related videos on Youtube
Author by
memecs
Updated on November 16, 2020Comments
-
memecs over 3 years
This is my project tree:
project | + src | + external | | + foo | | | + include | | | | - foo.hpp | | | + src | | | | - foo.cpp | | | | - CMakeLists.txt | | | - CMakeLists.txt | | + CMakeLists.txt | + src | | - main.cpp | - CMakeLists.txt
foo.cpp includes foo.hpp:
// foo.cpp #include "foo.hpp"
Now the problem is that including the directory in the top CMake successfully find foo.hpp, but if I include in the subproject it doesn't. Any reason for it? (directories are included before the executable is compiled).
// project/CMakeLists.txt include_directories(external/foo/include) //OK add_subdirectory(external) add_executable(main main.cpp) target_link_libraries(main foo) // project/external/CMakeLists.txt add_subdirectory(foo) // project/external/foo/CMakeLists.txt include_directories(include) // NOT WORKING add_subdirectory(src) // project/external/foo/src/CMakeLists.txt add_library(foo foo.cpp)
-
Angew is no longer proud of SO over 10 yearsThere seems to be a mismatch between
external/include
in the top-level CMakeList andexternal/foo/include
in the CMakeList inside foo - perhaps that's the issue? -
memecs over 10 yearsI made some edits, there might have been some errors before, but it should be ok now
-
Angew is no longer proud of SO over 10 yearsThe docs claim otherwise, but it seems the include directories are not inherited by subdirectories. You can test whether this is the case using a separate mini project.
-
memecs over 10 yearsActually reading some posts looks like they do not propagate up, same for add_definitions...
-
-
Admin over 10 years
But unfortunately, propagation from lower-level to higher-level CMakeLists is not possible in cmake, except for cached values
it's not true, for regular (non-cache) variables PARENT_SCOPE can be used -
Sandburg over 5 years
CMAKE_SOURCE_DIR
is not recommanded, use preferablyCMAKE_CURRENT_SOURCE_DIR
. See fujii.github.io/2015/10/10/cmake-best-practice -
Moshe Rabaev almost 4 yearswell you would want to sepcify
CMAKE_CURRENT_SOURCE_DIR
if you want it to be in the compile commands json if set to true.