RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1051669
Accepted
user252359
user252359
Asked:2020-11-28 16:21:21 +0000 UTC2020-11-28 16:21:21 +0000 UTC 2020-11-28 16:21:21 +0000 UTC

CMake 有什么用?

  • 772

我需要 CMake 做什么?为了快速编译?

cmake
  • 5 5 个回答
  • 10 Views

5 个回答

  • Voted
  1. arrowd
    2020-11-29T02:55:45Z2020-11-29T02:55:45Z

    应@pepsicoca1的要求,我正在写一篇详细的帖子。


    编译器

    首先是编译器。一个控制台程序,您提供一个带有代码作为输入的文件,它为您提供一个可以运行的二进制文件。对于类 Unix,它看起来像这样:

    gcc main.c
    

    对于这样的 MSVC:

    cl.exe main.c
    

    但是,任何或多或少复杂的项目都包含的不是一个,而是几个(很多!)带有源代码的文件。可以创建一个简单的脚本来编写它

    gcc file1.c file2.c ... file123.c
    

    但是,每次只更改其中一个代码文件时,都需要重新编译程序,此命令将重建所有 123 个文件。它很慢而且很不方便。需要一些东西来检测更改的文件并仅重建它们。


    制作

    一种这样的解决方案是make. 如果说详细点,那么有几种方言make: Linux 使用所谓的。GNU Make,在 FreeBSD 上是 BSD Make,在 Windows 上是 NMake。

    make接受描述规则的文件作为输入。每个规则只是一个或多个生成某种文件的命令。规则可以使用其他规则执行产生的文件,从而形成依赖树。所有最终生成的文件都组合成一个规则all,因此该命令make all允许您“构建”整个项目。

    我将“编译”一词放在引号中,因为事实上,它make不一定只用于编译器。make标题中的手册说:

    make-maintain 程序依赖

    那些。make- 这是一个用于管理依赖关系的程序,取决于什么并不重要。


    项目配置

    麻烦并没有就此结束。C 和 C++ 语言的设计方式是,为了使用任何第三方库,您需要告诉编译器的路径

    1. 包含库头文件的目录。
    2. 包含库本身的目录。

    头文件由-I类 Unix 操作系统上的标志/I和 Microsoft 编译器上的标志指定:

    gcc -I/full/path/to/vasyanlib/include ...
    cl.exe /I"C:\Program Files\VasyanLib\Include" ...
    

    同样,库的目录是用-L/指定的/LIBPATH。

    但这很不幸——在不同的计算机上VasyanLib,它可以安装在不同的目录中!这意味着如果您想将您的代码提供给其他人,或者只是在另一台机器上自己编译您的代码,那么您将不得不编辑您的构建脚本(读取,编译器调用命令)。

    如果您的构建脚本受版本控制( , 等),这尤其不方便git,hg因为svn您必须每次都提交这些更改,或者它们会“挂起”您未提交的内容。

    无花果将与它们一起使用库,但有时您需要找到编译器本身或某些文件。有时您需要确定操作系统的类型和版本、支持的编译器标志,并根据支持等添加一些。

    因此,除了项目构建阶段之外,还会出现配置阶段。在这个阶段,在任何脚本或程序的帮助下,执行必要的检查和搜索,并将结果输入Makefile(好吧,今天这个Makefile只是完整地生成)和/或格式化为头文件许多指令#define允许代码确定该文件或其他文件或功能的存在。


    装配系统

    在这一点上,称为构建系统的软件的作用变得清晰。他们是

    1. 定义项目的结构,即 它由什么“目标”组成。例如,一个项目可能包含一个库、一个使用该库的应用程序和一套测试应用程序。
    2. 解决项目配置问题。
    3. 解决项目构建问题。
    4. 他们解决额外的任务:清理- 删除构建结果,测试- 以某种方式运行测试,打包- 创建发布档案和安装程序等。

    也许第一个构建系统是 Autotools。现在已经有很多了,在我看来, CMake是其中最通用的。其余的构建系统要么依赖于操作系统,要么依赖于编程语言。


    CMake 与 IDE

    现在,在考虑了整个历史之后,我们还可以分析 CMake 和构建系统是否总体上是“遗留”的问题,以及 IDE 是否绕过了它们。

    答案是,当然不是。不仅可以在构建系统不断且积极地开发这一事实中找到这一点,而且还在于即使在不需要任何构建系统的 Visual Studio 中,也添加了对 CMake 的支持。

    关于 Visual Studio 的几句话。这个 IDE 有它自己的项目格式,事实上,它有它自己的构建系统。Studio 项目在功能意义上相当于Makefileam 或CMakeLists.txtam。在我看来,使用它们的不便之处如下:

    1. 缺少配置步骤。到目前为止,我不知道如何在工作室的 C++ 项目中指出它需要什么VasyanLib,以至于当我尝试构建项目时,工作室会问我这个库的位置,而不是吐槽 build错误。

    2. 在构建过程中很难使用第三方实用程序。例如,我有一个项目,首先构建一个 Haskell 程序,运行它,然后生成 C++ 代码,该代码已经变成了最终程序。在 CMake 上,花了 10 行,但在工作室我不知道如何实现它。


    哲学

    实际上,不需要IDE 项目文件。CMakeLists.txt因为这些文件已经是项目文件,所以不需要它们。此外,它们是通用的,不仅与操作系统相关,而且与使用的 IDE 相关——目前,除了 Makefile、Visual Studio 和 Eclipse 项目之外,CMake 还可以生成。

    在我看来,第一个理解这种深刻思想的 IDE 是KDevelop。原则上没有项目文件。从概念上看,这不仅是一个很酷的解决方案,而且具有实用价值——例如,KDevelop 以与 CMake 本身相同的方式“查看”项目文件。特别是,如果#include你们中的一些人用红色下划线,那么这意味着你搞砸了 CMake 代码。而在工作室中,这个错误可能会被忽略,并且只出现在具有不同目录配置的另一台计算机上。

    希望这么详细的帖子能原谅KDevelop的无耻广告。但这是一个非常棒的 IDE,我花了很多时间开发。

    • 24
  2. Sheridan
    2020-11-28T20:36:02Z2020-11-28T20:36:02Z

    需要 CMake(以及 make、qmake、gmake、consul 等)来描述构建项目的规则。也就是说,它旨在回答问题

    • 项目的源代码在哪里?
    • 项目二进制文件的名称是什么?
    • 项目库的名称是什么?
    • 项目使用哪些外部库,它们位于何处?
    • 构建以调试或发布?
    • 组装前要采取哪些步骤?接着?
    • 还要别的吗...

    此外,CMake 不仅仅是一种声明性描述,它是一种用于编写构建项目的代码的语言,而 CMake 已经有许多方法可以自动搜索库、当前架构等。

    同时,CMake 文件比例如 Visual Studio 中的解决方案更具可读性和可理解性。

    例如,在我的一个关于 arduino 的宠物项目中,我为 linux 组装了一个恶魔,为 arduino 组装了一个带有一个 CMake 文件的固件,并将这个固件上传到 arduino。

    • 10
  3. user361503
    2020-11-28T16:24:26Z2020-11-28T16:24:26Z

    组织C/C++一个项目。去官网https://cmake.org/就够了。

    CMake 是一个开源、跨平台的工具系列,旨在构建、测试和打包软件。CMake 用于使用简单的平台和编译器独立配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用的本机 makefile 和工作区。

    • 1
  4. Yaroslav
    2020-12-03T16:26:11Z2020-12-03T16:26:11Z

    要为微控制器创建程序,有时除了 make 和 cmake 实用程序别无选择。制造商的 IDE 将大量未使用的代码插入代码中,并且无法使用 IDE 工具将其从程序中删除。我必须在没有 IDE 的情况下构建一个项目。

    • 0
  5. Best Answer
    pepsicoca1
    2020-11-28T17:14:31Z2020-11-28T17:14:31Z

    make 和 Cmake 实用程序是 Unix 从没有 IDE 并且 Consul(!) 打字机是终端的日子以来的遗留物。:-) 原则上,Unix-oids 仍然将这种方法用于开发和构建项目,作为最常见的方法。有时你离不开它,但它在现实生活中的份额正在减少。每个人都在 IDE 上工作,不会为 make 和 Cmake 烦恼。

    您可能需要 Cmake 的另一件事是将程序作为开源分发。如果作者为项目提供了 Cmake,那么用户在他们的机器上重建项目就更容易了。在这种情况下,用户不需要弄清楚源在哪里、标题在哪里、库在哪里等等。如果您分发的项目不是 Cmake,而是 IDE 的配置文件,那么,首先,仅使用相同的 IDE 即可轻松重建项目。其次,用户机器上的 IDE 必须与项目作者的机器在同一个磁盘和相同的路径。


    那么这篇文章仍然不会解释 - 为什么?

    TC没有问为什么。TS问为什么。TS 询问如果长期以来有方便的 IDE,为什么他和我们所有人都需要 CMake。我试图回答为什么现在,在 2019 年,可能需要 CMake。没有什么比开源项目的传播更有说服力了。

    答案是“为什么”是显而易见的——因为 IDE 更易于使用。使用 IDE 时,您不必在每次将源文件添加到项目时手动编辑 CMake 配置。在 IDE 中,一切都在一个瓶子里——一个编辑器、一个调试器、一个编译器、语法突出显示、源代码格式化、错误突出显示、分析器等等。所有这些都不在 CMake 中,而且通常所有这些都不在通过命令行的旧开发方法中。这就是 CMake 被“逼入黑暗角落”的原因。这就是为什么 99% 的程序员只使用 IDE 工作的原因。

    没有配置步骤。到目前为止,我不知道如何在工作室的 C++ 项目中指定它需要 VasyanLib,以至于在尝试构建项目时,工作室会询问我这个库的位置,而不是吐槽构建错误。

    不重要。99% 的项目通过对库位置的静态引用来解决问题。如果它很关键,那么这个功能将被添加到 IDE 中。

    在构建过程中很难使用第三方实用程序。例如,我有一个项目,首先构建一个 Haskell 程序,运行它,然后生成 C++ 代码,该代码已经变成了最终程序。在 CMake 上,花了 10 行,但在工作室我不知道如何实现它。

    同样不是关键。99% 的项目在构建过程中不使用第三方实用程序。如果它很关键,那么这个功能将被添加到 IDE 中。预启动一个 Haskell 程序来写一个 C++ 程序供后续翻译,这样的 EXOTIC 不值一提。甚至没有 1% 的程序员以这种方式工作,0.00001% 的程序员以这种方式工作。是的,一般来说,即使是现在也没有人会在组装之前/组装之后通过使用第三方实用程序运行单独的批处理文件来中断。

    所有提到的使用 IDE 的“不便”并没有超过使用 IDE 的“方便”。并且手动编辑 Cmake 的配置仍然是一种乐趣。此外,同时,记住这种鸟语配置的所有鸟规则。

    总的来说,总结一下,Unix 风格的汇编,以及丹尼斯·里奇父亲时代的 Unix 风格的工作,这是为老派一代准备的,他们在 make 和 Cmake 配置语言出现之前就设法学习了使用 IDE(顺便感谢这家令人难忘的 Borland 公司)。越远,这样的恐龙就越少,这是最好的。这些天没有人用代码编程。曾经有专家记住了整个 PDP-11 命令系统的所有代码(!)(甚至不是汇编程序助记符,而是 CODES)。:-)

    它是一个构建脚本生成器,因此可以在不同的 IDE 和构建系统之间移植项目,

    这一切都很好,但是 99% 的项目不需要在不同的 IDE 和构建系统之间移植。因此,在 99% 的情况下不需要此 Cmake 属性。

    并且还允许您以比单击鼠标更方便的方式管理项目配置。

    一个非常可疑的说法。

    同一个 vizhak 的项目文件的主要问题是它们的版本令人作呕,对于大型项目,这会产生问题。

    以及如何使用 Cmake 帮助版本控制项目?此外,对于版本控制,现在使用同一个 git 等各种版本控制系统。这也不是命令行工具。

    因为反对 CMake 和 IDE 是错误的。这是一个也可以与 IDE 一起使用的构建系统。

    可以使用。或者可能没有使用。99% 的项目不使用 CMake。而且 99% 的程序员不使用 CMake。而且,这个数字只会增长得越多。问题来自一个快乐地生活在 IDE 下的人,突然发现还有 CMake。自然,他有一个问题 - 在此之前他是如何生活的并且没有使用 CMake 并且一切都为他工作?:-) 但是 CMake 的时代已经过去,CMake 只留给老卫兵,他们死了但没有放弃(С)拿破仑波拿巴。:-)


    随着优秀的和不同的 IDE 的发展,CMake 和有福的命令行的作用一直在下降。:-)

    看起来相当矛盾的是,TC 对答案相当满意,而公众继续义愤填膺地告诉 Cmake 是什么。问题不在于 Cmake 是什么,而在于为什么需要 Cmake,如果有 IDE 可以做 Cmake 可以做的所有事情,因此 IDE 使 Cmake 变得不必要。

    汽车取代了马,IDE 完全取代了 Cmake。这被称为技术进步。你仍然可以骑手推车,但为什么呢?您仍然可以使用 Cmake 构建项目,但为什么呢?

    嗯,很清楚为什么。事实上,有 1% 的项目需要跨不同的 IDE 和平台进行移植。对于这样的项目,也许使用 Cmake 是合理的。但现在不是主流。这是一个非常小众的应用程序。

    • -16

相关问题

  • 如何添加子文件夹中的文件

  • 库的 CMake 配置

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5