关于C#:CMCC未检测到包含GCC的标头(使用`-include`)更改

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

我正在观察奇怪的CMake行为。如果我的项目具有通过ADD_COMPILE_OPTIONS(-include inc.h)命令使用-include inc.h包含到所有源的头文件,则更改为从未检测到的头。这意味着我可以更改标题,但是CMake绝不会尝试重新编译main.cpp。难道我做错了什么?这是CMake的错误吗?任何解决方法?

CMakeLists.txt

1
2
3
4
5
6
7
8
9
10
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)

main.cpp

1
2
3
4
5
6
7
8
9
#include <iostream>

int main()
{

    foo a;
    std::cout << a.bar << std::endl;
    return 0;
}

inc.h

1
2
3
4
5
struct foo
{
    int bar = 1;
    double baz = 3;
};

EDIT001:
正如@Oliv建议的那样,当尝试使用SET_SOURCE_FILES_PROPERTIES(main.cpp PROPERTY OBJECT_DEPENDS inc.h)之类的东西时当然不会起作用,因为依赖关系应该是目标而不是cpp所依赖的文件,因此我添加了以下内容:

1
2
3
4
5
6
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的更改。