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

Kyl*_*and 3 c++ cmake ninja

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

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

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

Flo*_*ian 5

将我的评论变成答案

收集您的源文件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文件之一。

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

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

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

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

configure_file(${CMAKE_SOURCE_DIR}/.git/index ${PROJECT_BINARY_DIR}/git_index.tmp) 
Run Code Online (Sandbox Code Playgroud)

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

一些参考资料