如何使用 CMake 正确添加包含目录

新手上路,请多包涵

大约一年前,我询问了 CMake 中的标头依赖项

我最近意识到问题似乎是 CMake 认为这些头文件是项目 外部 的。至少,在生成 Code::Blocks 项目时,头文件不会出现在项目中(源文件会出现)。因此,在我看来,CMake 认为这些标头是项目 外部 的,并且不会在依赖项中跟踪它们。

在 CMake 教程中的快速搜索只指向 include_directories 这似乎没有做我希望的事情……

向 CMake 发出信号表明特定目录包含要包含的标头以及应由生成的 Makefile 跟踪这些标头的正确方法是什么?

原文由 Matthieu M. 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

必须做两件事。

首先添加要包含的目录:

 target_include_directories(test PRIVATE ${YOUR_DIRECTORY})

如果您使用非常旧的 CMake 版本(2.8.10 或更早版本)而不支持 target_include_directories ,您也可以使用旧版 include_directories 代替:

 include_directories(${YOUR_DIRECTORY})

然后,您还必须将头文件添加到当前目标的源文件列表中,例如:

 set(SOURCES file.cpp file2.cpp ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)
add_executable(test ${SOURCES})

这样,头文件将在 Makefile 中显示为依赖项,例如在生成的 Visual Studio 项目中(如果您生成一个)。

如何将这些头文件用于多个目标:

 set(HEADER_FILES ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h)

add_library(mylib libsrc.cpp ${HEADER_FILES})
target_include_directories(mylib PRIVATE ${YOUR_DIRECTORY})
add_executable(myexec execfile.cpp ${HEADER_FILES})
target_include_directories(myexec PRIVATE ${YOUR_DIRECTORY})

原文由 SirDarius 发布,翻译遵循 CC BY-SA 4.0 许可协议

你有两个选择。

老人:

 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

原文由 Victor Mwenda 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题