我正在观察奇怪的 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/