GCC 包含标头(使用"-include")CMake 未检测到的更改
GCC included header (using `-include`) changes not detected by CMake
我观察到奇怪的CMake行为。如果我的项目有一个头文件包含在使用-include inc.h
的所有源中,则ADD_COMPILE_OPTIONS(-include inc.h)
命令,则从未检测到对标题的更改。这意味着我可以更改标头,但 CMake 永远不会尝试重新编译main.cpp
。我做错了什么吗?是CMake错误吗?有什么解决方法吗?
CMakeList.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.12)
PROJECT(include_test)
SET(CMAKE_CXX_STANDARD 17)
INCLUDE_DIRECTORIES(.)
ADD_COMPILE_OPTIONS(
-include inc.h
)
ADD_EXECUTABLE(include_test main.cpp)
主.cpp
#include <iostream>
int main()
{
foo a;
std::cout << a.bar << std::endl;
return 0;
}
Inc.H
struct foo
{
int bar = 1;
double baz = 3;
};
EDIT001: 正如@Oliv所建议的,当尝试使用类似SET_SOURCE_FILES_PROPERTIES(main.cpp PROPERTY OBJECT_DEPENDS inc.h)
当然,它不起作用,因为依赖项应该是目标,而不是 cpp 所依赖的文件,所以我添加了以下内容:
ADD_CUSTOM_TARGET(HeaderChanged
DEPENDS
inc.h
COMMENT "Checking if include file has changed")
SET_SOURCE_FILES_PROPERTIES(main.cpp PROPERTY OBJECT_DEPENDS HeaderChanged)
尽管存在HeaderChanged
目标,但仍会导致make[2]: *** No rule to make target 'HeaderChanged', needed by 'CMakeFiles/include_test.dir/main.cpp.o'. Stop.
关于你的EDIT0001: 您可能需要指定要inc.h
的整个路径,以便 Makefile 知道在哪里可以找到它(因为您很可能正在执行源代码外构建(,即:
SET_SOURCE_FILES_PROPERTIES(main.cpp PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_LIST_DIR}/inc.h)
另请注意,OBJECT_DEPENDS
解决方案不适用于 Visual Studio(标志也不适用于-include
(。但是在Visual Studio中,添加ADD_COMPILE_OPTIONS(/FIinc.h)
就足够了,它会自动检测inc.h
更改。
- 使用CMake检测支持的C++标准
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 下面是我为检测链接列表中的循环而制作的代码
- 落砂模拟碰撞检测C++和SFML
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么C++编译器没有检测到正确声明的类?
- 检测win32服务创建和删除的最佳方法
- 正在LLVM中检测整数比较条件
- 如何在鼠标挂钩过程中检测拖动
- 位移操作和位掩码未检测到重复字符
- 检测 COFF 对象文件中C++内联符号
- qmake:检测目标位宽(32 位或 64 位)
- 增强精神解析器规则以检测语句中的特殊结尾
- 用于C++的静态二进制检测或二进制重写工具和框架
- Tensorflow对象检测在Python和C++(OpenCV)之间有不同的结果
- C++中的张量流对象检测
- 如何检测我何时向可变参数函数传递"std::string"而不是"c_str()"