我有一个大型项目,可完美在Windows上运行。
在CMakeLists.txt
中应用了一些更改并构建了项目后,Visual Studio项目将正确更新。
Xcode版本:10.0(10A255)或10.1(10B61)(在不同的计算机上测试)。
cmake版本:3.12.2或3.13.1
在Mac OS上为Xcode构建相同项目时出现问题。 配置cmake之后:
cmake .. -G Xcode
生成的项目运行正常,一切正常构建并且测试通过。
现在,当修改CMakeLists.txt
文件(开发项目或从存储库中获取新更改)并且选择ZERO_CHECK
或BUILD_ALL
时,构建不会导致Xcode项目更新。
调用cmake .
也不会检测到更改。
我发现最好的解决方法是删除一切两个文件:cmake_install.cmake
和CMakeCache.txt
。然后重新运行生成项目cmake .. -G Xcode
的命令。
在这种情况下,可以从头开始重做整个检测,但是至少构建不是从零开始的(不会重新编译未更改的文件)。
这很痛苦,因为必须完成许多手动工作,并且必须重新创建项目,这会浪费时间。
在以前的某个项目中,我遇到了类似的问题,但是仅当maven检测到依赖项更新时才发生这种情况,因此这种情况很少发生。发生这种情况时,我刚刚打电话给touch CMakeLists.txt
并重新构建,此解决方法很好。此解决方案不适用,因为每个版本都有此问题。
我怀疑protobuf的生成过程中有某些东西,但是当我禁用它时,问题仍然存在。
我试图通过创建简单的项目文件来提供完整的最小示例,但是我无法重现该问题。对于其他所有项目,它都可以正常工作,因此系统配置不是问题。
运行cmake
来查找此问题的根源时,如何调试项目生成过程?
这是一个已知问题吗?
是否有更好的解决方法,不会导致完全重建重新生成项目文件(还涉及检测系统功能)?
答案 0 :(得分:0)
这是一个已知问题吗?
在 CMake Discourse 上,Craig Scott(CMake 维护者之一)评论了这个错误的一个变体,作为 Xcode 的已知架构限制:
<块引用>使用 Xcode 生成器,目标依赖于 ZERO_CHECK
目标,如果发生变化,它会自动为您重新运行 cmake
。但问题是该运行中构建的其余部分仍然使用 cmake .
运行之前的旧细节。如果您再次构建,则会重新构建任何细节发生更改的内容,但如果您知道更改的项目的相关信息,首先明确重新运行 cmake .
会更加稳健,并且可能避免更多不必要的重新构建。
-- https://discourse.cmake.org/t/documented-criteria-for-build-correctness/3087/2?u=alex
鉴于此,您关于“调用 cmake .
未检测到更改”的评论很奇怪,但可能是旧的 CMake 版本,例如您在提出此问题时使用的 3.12 和 3.13,具有此后已修复的错误。它也可能是我们只能猜测的特定于项目的东西。缺少 CMAKE_CONFIGURE_DEPENDS
目录属性? set(... CACHE ... FORCE)
通话不好?不能说...