我一直在使用 CMake 来管理一个单独的小型 c++ 项目(基于 Unix Makefile),并决定将其转换为更有组织的源代码外构建。但是,当它超出源时(通过执行cmake ..
在 build/) 中,我的标头不再是其源文件的依赖项。如果我只是从顶层进行 cmake,一切都会恢复正常。
所以我做了一个小测试版本,发现了同样的问题。顺便说一句,我使用的是 Arch Linux 系统。最初,我的项目位于 /tmp 目录(有意)并通过阅读这个问题:使用 cmake 处理头文件依赖关系 https://stackoverflow.com/questions/7461000/handling-header-files-dependencies-with-cmake,我认为这可能是罪魁祸首,因为 CMake 可能将目录视为系统目录,因此认为我的标头来自系统库,所以我将其移至我的主文件夹。没有改变。然后我搞乱了 CMakeLists.txt 中的路径,但它似乎没有改变任何东西。我还尝试用绝对路径替换所有内容。
项目/CMakeLists.txt:
cmake_minimum_required (VERSION 2.8)
project (MYTEST)
include_directories(${CMAKE_SOURCE_DIR}/include)
file(GLOB SOURCES "${CMAKE_SOURCE_DIR}/src/*.cpp")
add_executable(app ${SOURCES})
项目/src/hey.cpp:
#include "hey.h"
int main()
{
std::cout << "Heyyy" << std::endl;
return 0;
}
项目/include/hey.h:
#include <iostream>
现在,如果我创建一个新目录 project/build 并cmake ..
然后从该目录make
,项目编译。但是,如果我以任何方式改变 hey.h 并尝试make
再次,什么都不会重新编译。 dependent.make文件与此一致:
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.15
CMakeFiles/app.dir/src/hey.cpp.o: ../src/hey.cpp
但如果我cmake .
从顶层目录project
,一切顺利,依赖项都存在:
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.15
CMakeFiles/app.dir/src/hey.cpp.o: src/hey.cpp
CMakeFiles/app.dir/src/hey.cpp.o: include/hey.h
我发现人们有类似的问题,但大多数都是边缘情况,导致只有一个标头不被包含在内。我的实际项目没有找到任何标头依赖项。 /:我很容易就使用 CMake 犯了严重错误(我对它有点陌生),但我环顾四周,发现每个人的做法似乎都不同。