CMake/Ninja试图编译已删除的“.cpp”文件
CMake/Ninja attempting to compile deleted `.cpp` file
我发现当我使用 cmake
和 ninja
从项目中删除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:制作任意文件触发器的正确方法
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何在cpp文件之间切换窗口?在Qt中
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- C++ 链接到单独的.cpp文件说"multiple definitions"
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 如何使用 samtools C API 构建一个简单的主.cpp文件
- 包含在.cpp文件中包含在 .h 文件时包含
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 如何使用线程类编译 cpp 文件?
- 使用 Powershell 命令将 cpp 文件的文件夹编译为 GNU 的 g++
- 我应该将外部标头放在 .h 文件还是.cpp文件中?
- 从另一个 cpp 文件更改结构内、映射键内的变量