大约一年前,我问过CMake中的头依赖关系。
我最近意识到,问题似乎是CMake认为这些头文件是项目的外部文件。至少,在生成Code::Blocks项目时,头文件不会出现在项目中(源文件会出现)。因此,在我看来,CMake认为这些头文件是项目的外部,并没有在依赖项中跟踪它们。
在CMake教程中快速搜索只指向include_directories,这似乎不是我想要的…
向CMake发出特定目录包含要包含的头文件,以及生成的Makefile应该跟踪这些头文件的正确方法是什么?
大约一年前,我问过CMake中的头依赖关系。
我最近意识到,问题似乎是CMake认为这些头文件是项目的外部文件。至少,在生成Code::Blocks项目时,头文件不会出现在项目中(源文件会出现)。因此,在我看来,CMake认为这些头文件是项目的外部,并没有在依赖项中跟踪它们。
在CMake教程中快速搜索只指向include_directories,这似乎不是我想要的…
向CMake发出特定目录包含要包含的头文件,以及生成的Makefile应该跟踪这些头文件的正确方法是什么?
当前回答
这招对我很管用:
set(SOURCE main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE})
# target_include_directories must be added AFTER add_executable
target_include_directories(${PROJECT_NAME} PUBLIC ${INTERNAL_INCLUDES})
其他回答
如果与其他创建Makefile的方法(例如make或qmake)相比,CMake更像是一种脚本语言。它不像Python那样酷,但仍然很酷。
如果在各种开源项目中寻找人们如何包含目录,就没有“适当的方法”这样的东西。但是有两种方法。
Crude include_directories will append a directory to the current project and all other descendant projects which you will append via a series of add_subdirectory commands. Sometimes people say that such approach is legacy. A more elegant way is with target_include_directories. It allows to append a directory for a specific project/target without (maybe) unnecessary inheritance or clashing of various include directories. Also allow to perform even a subtle configuration and append one of the following markers for this command.
PRIVATE -仅用于此指定的构建目标
PUBLIC -用于指定目标和与此项目相关的目标
INTERFACE——仅用于与当前项目链接的目标
PS:
这两个命令都允许将目录标记为SYSTEM,以提示指定的目录是否包含警告与您无关。 类似的答案是其他成对的命令target_compile_definitions/add_definitions, target_compile_options/CMAKE_C_FLAGS
我使用的是CLion,我的项目结构如下:
--main.cpp
--Class.cpp
--Class.h
--CMakeLists.txt
修改前的CMakeLists.txt:
add_executable(ProjectName main.cpp)
修改后的CMakeLists.txt:
add_executable(ProjectName main.cpp Class.cpp Class.h)
通过这样做,程序编译成功。
你有两个选择。
旧:
include_directories(${PATH_TO_DIRECTORY})
而新的
target_include_directories(executable-name PRIVATE ${PATH_TO_DIRECTORY})
要使用target_include_directories,您需要定义可执行文件- add_executable(executable-name sourcefiles)。
所以你的代码应该是这样的
add_executable(executable-name sourcefiles)
target_include_directories(executable-name PRIVATE ${PATH_TO_DIRECTORY})
你可以在这里阅读更多内容https://cmake.org/cmake/help/latest/command/target_include_directories.html
不要忘记包含${CMAKE_CURRENT_LIST_DIR}。 这就是给我带来麻烦的原因。
示例应该是这样的:
target_include_directories(projectname
PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include"
)
PUBLIC用于您想要包含在父项目中的依赖项。 对于那些你不喜欢的人来说是私密的。
这招对我很管用:
set(SOURCE main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE})
# target_include_directories must be added AFTER add_executable
target_include_directories(${PROJECT_NAME} PUBLIC ${INTERNAL_INCLUDES})