CMake/Ninja试图编译已删除的“.cpp”文件

CMake/Ninja attempting to compile deleted `.cpp` file

本文关键字:cpp 文件 删除 Ninja 编译 CMake      更新时间:2023-10-16

我发现当我使用 cmakeninja 从项目中删除cpp文件时,如果不先完全删除我的构建目录并从头开始,我就无法轻松编译它。CMake 和/或 Ninja 显然会删除对它编译的所有cpp文件的大量引用,即使在重新运行 CMake 之前删除 CMake 缓存也不会删除所有引用。

这是一个已知问题吗?有解决办法吗?我偶尔会跑rm $(grep -R <filename> <builddir>),但这是一个可怕的笨蛋。

编辑:看来我错了,因为我无法复制这个问题。手动重新运行 CMake 似乎总是生成正确的.cpp文件列表,即使使用 GLOB 生成源列表也是如此。

将我的评论变成答案

使用 file(GLOB ...) 收集源文件

是的,CMake 在使用 file(GLOB ...) 命令收集源文件时不会知道新的或删除的源文件。这是 CMake 的已知限制。正是因为这个原因,我已经更改了我的 CMake 项目以单独列出所有源文件。出于方便起见,我仍在使用 file(GLOB ...) 命令收集我的头文件。

引用 CMake 的 file() 命令文档:

我们不建议使用 GLOB 从以下位置收集源文件列表 您的源树。如果没有 CMakeLists.txt则当源 添加或删除,然后生成的构建系统无法知道何时 要求 CMake 再生。

删除CMakeCache.txt以重新触发配置

仅删除CMakeCache.txt可能不足以重新触发 CMake 配置。问题0014820:警告用户仅删除CMakeCache.txt声称您还需要删除所有CMakeFiles目录。

根据我的经验,重新触发CMake配置的最可靠方法是触摸其中一个项目CMakeLists.txt文件。

注意:对于ninja CMake 添加一个rebuild_cache目标,以便再次方便地为您的项目运行 CMake。

从源代码管理更新后重新触发

只有一个想法:如果删除源文件是因为它们已从源代码管理中删除而发生的,则可能有一种解决方法仍允许您在源文件上使用file(GLOB ...)

例如,如果您使用 GIT,则可以将以下内容添加到您的主CMakeLists.txt

configure_file(${CMAKE_SOURCE_DIR}/.git/index ${PROJECT_BINARY_DIR}/git_index.tmp) 

缺点:它会重新触发每个 GIT 操作(更新、提交等)的配置。

一些参考资料

  • 在 Eclipse 中添加文件时运行 CMAKE
  • CMake:制作任意文件触发器的正确方法