c++ - GCC 包含 header (使用 `-include` )CMake 未检测到的更改

标签 c++ cmake

我正在观察奇怪的 CMake 行为。如果我的项目通过 ADD_COMPILE_OPTIONS(-include inc.h) 命令将头文件包含到所有使用 -include inc.h 的源中,则从未检测到对头的更改.这意味着我可以更改 header ,但 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)

主要.cpp

#include <iostream>

int main()
{

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

公司.h

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

编辑001: 正如@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]: *** 没有规则使目标 'HeaderChanged' 成为 'CMakeFiles/include_test.dir/main.cpp.o' 所需要的。停止。 尽管 HeaderChanged 目标存在

最佳答案

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

关于c++ - GCC 包含 header (使用 `-include` )CMake 未检测到的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52685787/

相关文章:

c++ - 在未排序的对数组中查找 K UNIQUE 最大元素

c - 在整个项目上使用 cmake 后,在子目录中使用 Cmake 时出现问题

cmake - 在每个配置的基础上定义 CMake 目标文件目录

visual-studio - 从 cmake 引用 Visual Studio 变量

c++ - 编译器如何理解指针类型?

c++ - 导出从另一个模块导入的类

c++ - 是否可以#include 命名空间类到另一个命名空间

c++ - CMake、VTK8 和 Embarcaderos Clang 编译器

windows - 如何在 Windows 上为 CMake 自定义命令设置运行时路径

c++ - 为什么析构函数在这里被调用两次?