GCC 包含标头(使用"-include")CMake 未检测到的更改

GCC included header (using `-include`) changes not detected by CMake

本文关键字:quot 检测 CMake -include 包含标 使用 GCC      更新时间:2023-10-16

我观察到奇怪的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更改。