我一直在使用 CMake 来管理一个单独的小型 c++ 项目(基于 Unix Makefile),并决定将其转换为更有组织的源外构建。但是,当它超出源代码时(通过在 build/中执行 cmake ..
),我的 header 不再依赖于它们的源文件。如果我只是从顶层开始,一切都会好起来的。
所以我做了一个小测试版,发现了同样的问题。顺便说一句,我在 Arch Linux 系统上。最初,我的项目在/tmp 目录中(有意),通过阅读这个问题:Handling header files dependencies with cmake ,我认为这可能是罪魁祸首,因为 CMake 可能将目录视为系统目录,因此认为我的 header 来自系统库,所以我将其移至我的主文件夹。没有改变。然后我弄乱了我的 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
,则不会重新编译任何内容。 depend.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
但是如果我从顶层目录 project
cmake .
,一切顺利并且依赖项都在那里:
# 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
我发现有人遇到了类似的问题,但大多数都是边缘情况,导致只有一个标题未包含在内。我的实际项目没有找到任何 header 依赖项。/: 我很可能只是错误地使用 CMake(我对它有点陌生),但我环顾四周,每个人似乎都以不同的方式使用它。
最佳答案
如果您的构建目录是源目录的子目录,那么它并不是真正的源外目录,而是一种混合目录。推荐的 CMake 方法是在源目录和二进制目录完全不相关的地方进行适当的源外构建。这意味着他们可以是 sibling ,也可以是远亲,但都不是对方的后代。
关于c++ - 如果构建是源外的,CMake 无法找出头文件依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57167890/