【发布时间】: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
但是如果我从顶级目录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
我发现有人遇到类似问题,但大多数都是边缘情况,导致只有一个标题不包括在内。我的实际项目没有找到任何头文件依赖项。 /:我很容易就在使用 CMake 时犯了严重的错误(我对它有点陌生),但我环顾四周,似乎每个人的做法都不一样。
【问题讨论】:
-
你能尝试两件事吗? 1. 使您的构建树成为源树的兄弟(例如
cmake ../project)。 2. 还将头文件添加到add_executable()命令。如果您执行其中任何一项操作,问题行为是否会改变? -
@Angew 哇哦,是的,让它成为兄弟修复了它,谢谢!但是为什么呢?
-
你的情况不是在that answer 中描述的问题吗?
-
@Tsyvarev 我以为是,但我尝试了该解决方案但没有成功/: