【问题标题】:CMake cannot figure out header dependencies if build is out-of-source?如果构建是源外的,CMake 无法确定标头依赖项?
【发布时间】:2019-07-23 15:47:21
【问题描述】:

我一直在使用 CMake 管理一个单独的小型 c++ 项目(基于 Unix Makefile),并决定将其转换为更有条理的源代码外构建。但是,当它在源外(通过在 build/ 中执行 cmake ..)时,我的标头不再是其源文件的依赖项。如果我只是从顶层 cmake,一切都很好。

所以我做了一个小测试版本,发现了同样的问题。顺便说一句,我在 Arch Linux 系统上。最初,我的项目(故意)在 /tmp 目录中,通过阅读这个问题: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;
}

项目/包含/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

但是如果我从顶级目录projectcmake .,一切顺利并且依赖项都在那里:

# 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 时犯了严重的错误(我对它有点陌生),但我环顾四周,似乎每个人的做法都不一样。

【问题讨论】:

  • 你能尝试两件事吗? 1. 使您的构建树成为源树的兄弟(例如cmake ../project)。 2. 还将头文件添加到add_executable() 命令。如果您执行其中任何一项操作,问题行为是否会改变?
  • @Angew 哇哦,是的,让它成为兄弟修复了它,谢谢!但是为什么呢?
  • 你的情况不是在that answer 中描述的问题吗?
  • @Tsyvarev 我以为是,但我尝试了该解决方案但没有成功/:

标签: c++ linux cmake


【解决方案1】:

如果您的构建目录是源目录的子目录,那么它并不是真正的源代码外,而是一种混合。推荐的 CMake 方法是在源和二进制目录完全不相关的情况下进行适当的源外构建。这意味着它们可以是兄弟姐妹或被进一步移除,但都不是另一个的后代。

【讨论】:

  • 你知道为什么会这样吗?我认为在 CMakeLists.txt 所在的目录中创建一个构建目录是使用 cmake 编译的标准方式。
猜你喜欢
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多