我发现当我使用cpp
和cmake
从我的项目中删除ninja
文件时,如果没有先完全删除我的构建目录并从刮。 CMake和/或Ninja显然松散了对它编译的所有cpp
文件的一些引用,甚至在重新运行之前删除了CMake缓存.CMake没有删除所有引用。
这是一个已知问题吗?有解决方案吗?我偶尔会跑rm $(grep -R <filename> <builddir>)
,但这是一个可怕的笨蛋。
编辑:看来我错了,因为我无法复制此问题。手动重新运行CMake似乎始终生成.cpp
文件的正确列表,甚至使用GLOB
生成源列表。
答案 0 :(得分:4)
将我的评论转化为答案
file(GLOB ...)
是的,在使用file(GLOB ...)
命令收集源文件时,CMake不知道新的或已删除的源文件。这是CMake的已知限制。因为这个原因,我已经改变了我的CMake项目以单独列出所有源文件。出于方便,我仍然使用file(GLOB ...)
命令收集我的头文件。
引自CMake的file()
命令文档:
我们不建议使用GLOB从中收集源文件列表 你的源代码树。如果源没有更改CMakeLists.txt文件 添加或删除然后生成的构建系统无法知道何时 让CMake重新生成。
CMakeCache.txt
以重新触发配置仅删除CMakeCache.txt
可能不足以重新触发CMake配置。 Issue 0014820: warn users about removing only CMakeCache.txt声称您还需要删除所有CMakeFiles
目录。
根据我的经验,重新触发CMake配置的最可靠方法是触摸其中一个项目CMakeLists.txt
文件。
注意:对于ninja
,CMake会添加rebuild_cache
目标,以便为您的项目再次方便地运行CMake。
只有一个想法:如果删除源文件是因为它们已从源代码管理中删除,那么可能还有一种解决方法仍允许您在源文件上使用file(GLOB ...)
。
E.g。如果您使用GIT,则可以将以下内容添加到主CMakeLists.txt
:
configure_file(${CMAKE_SOURCE_DIR}/.git/index ${PROJECT_BINARY_DIR}/git_index.tmp)
缺点:它将重新触发每个GIT操作(更新,提交,...)的配置。
部分参考资料: