我有一个相当大的基于CMake的项目,发现在Windows上为Visual Studio生成解决方案时,我将当前项目的主目录作为包含目录。例如,这里是根目录的内容:
- A
- impl
- source.cpp
- header.h
- CMakeLists.txt
- B
- CMakeLists.txt
字符串
在source.cpp
中,我不小心写了#include "header.h"
而不是#include <A/header.h>
。并且这样的解决方案被成功编译,因为目录A
由于某种原因被添加到Visual Studio项目中的名为“附加包含目录”的列表中(即在命令行中添加了一个/I
选项)。
相同的源代码切片在Linux构建版本上给出类似于header.h not found
的错误(以及预期的行为)。
我应该采取哪些步骤来找到源代码为什么CMake将目标A的根目录添加到include_directories
的列表中。我使用answer打印了项目相关的include目录列表。CMake版本是3.27.1。
1条答案
按热度按时间ggazkfy81#
您可能希望使用生成器表达式通过自定义目标打印
[INTERFACE_]INCLUDE_DIRECTORIES
。这可以让您递归地检查依赖项,直到找到问题的根源。但是,这不会帮助您检测include_directories
命令的使用。打印目标信息.cmake
字符串
CMakeLists.txt
型
这允许您在构建目标
print_target_info
时在命令行输出中查看信息。此外,您可以使用
--graphviz=...
选项来更轻松地识别依赖关系,甚至可能发现两个平台之间的差异。