我正在观察奇怪的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
答案 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
的更改。