CMake的新人想知道什么是尘土飞扬的角落?

Gle*_*ter 15 build-process build cmake

我做了很多项目和很多不同的构建系统和CI工具.最近,我接触到了一个偶然的挑战性任务,即为一个合理大小的C++应用程序添加基于autotools的环境.虽然我喜欢最终用户的易用性,但我并不喜欢处理m4和开发人员方面的所有auto*工具.

我在业余时间做了一个相当大的辅助项目,并且决定我想把CMake用于试驾.由于我刚刚开始,我显然正在计划挖掘文档,常见问题解答,维基等,并边做边学.顺便说一下,我为"Mastering CMake"这本书付钱,但我在亚马逊上发现的评论足以让我觉得它可能不值钱.所有这一切,在任何新的东西中都经常会出现"陷阱",新人经常会偶然发现旧的专业人士早已学会避免.我想知道那些基于人们对CMake的经验是什么,我希望通过在这里询问来减少我的学习痛苦.

我应该指出,我计划主要在Linux上构建,以及其他UN*X变体.Windows并不是我的POV真正关心的问题.这是一个大型服务器端应用程序,具有用于操作员的Web和CLI界面,用于自动化/与OSS工具集成的北向REST接口,以及用于CPE的SOAP南向接口.我将需要很多第三方库和应用程序来实现这一切,除非我想在未来10年内手动构建这一切.:)

And*_*dré 20

首先,我认为CMake是一个出色的构建工具.到目前为止,它对多平台构建提供了最好的支持,并且具有查找第三方库的强大机制.与CPack相结合,它甚至为包装和安装提供了合理的选择.一些提示和可能的问题:

  1. 始终瞄准源外构建:一个显而易见的问题:为源内构建设计的项目很难将其构建为源外构建.因此,如果您可以从一开始就设计它,那就是针对源外构建.

  2. 语法:语法可能很奇怪,有很多奇怪的怪癖,尽管自2.6和2.8版本以来这种情况越来越好.

  3. 缓存变量.CMake跟踪变量和设置的缓存,有时在重建某些东西时这可能是一个问题.尝试删除CMakeCache.txt(或清理您的源外构建目录)并重建.DarenW也提到了这一点.

  4. 查找和配置第三方库:如果您有一个大型项目,取决于几个库(您自己的或第三方),这可能是最麻烦的.

    • 我认真推荐深入了解find_package命令.它功能非常强大,但完全取决于FindXXX.cmake文件的质量.特别是在多平台(主要是Windows和Mac)上构建时,这些文件可能需要一些调整,或者您可能需要编写自己的文件.

    • 调试"未定义的引用"或调试|发布或静态|共享之间的不匹配等链接库的问题可能很难调试.特别是对于第三方库,这些问题可能是由不正确的第三方FindXXX.cmake文件引起的......


Dar*_*enW 10

有一两件事,我花了一段时间来弄清楚:如果任何与构建进入疯狂,因为我已经改变了编译器选项,添加/删除.c文件,曾与支持库版本等混乱-这是最好的删除构建树并从头开始运行CMake.否则,即使CMake make似乎完成了他们的工作,生成的可执行文件也会崩溃.

这可能是我们"不这样做是正确的",但是这成为了许多工具,语言,框架等,这是不可能的,给大家在他们所依赖的软件专家,"不这样做是一个常见的问题"这是即使在专业人士中也能完成很多事情的唯一方法.CMake很多东西很聪明,但不是一切.Nuking构建树仍然是我们项目中常用的技术.