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

时间:2018-10-07 05:43:12

标签: c++ cmake

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

CMakeLists.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)

main.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)

尽管存在make[2]: *** No rule to make target 'HeaderChanged', needed by 'CMakeFiles/include_test.dir/main.cpp.o'. Stop.目标,但仍会导致HeaderChanged

1 个答案:

答案 0 :(得分:1)

在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的更改。