如果构建是源外的,CMake无法找出标头依赖性?

时间:2019-07-23 15:47:21

标签: c++ linux cmake

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

因此,我做了一个小的测试版本,发现了同样的问题。顺便说一下,我在Arch Linux系统上。最初,我的项目(有意地)位于/ tmp目录中,并且通过阅读以下问题:Handling header files dependencies with cmake,我认为这可能是罪魁祸首,因为CMake可能会将目录视为系统目录,因此认为我的标头来自系统库,因此我将其移至主文件夹。没有改变。然后,我弄乱了我的CMakeLists.txt中的路径,但似乎没有任何改变。我还尝试过用绝对路径替换所有内容。

project / 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})

project / src / hey.cpp:

#include "hey.h"

int main()
{
  std::cout << "Heyyy" << std::endl;
  return 0;
}

project / 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

但是,如果我从顶级目录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(我对此很陌生),但是我环顾四周,每个人的做法似乎都不一样。

1 个答案:

答案 0 :(得分:3)

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

相关问题