【问题标题】:Difference between Cmake, gnu make and manually compilingCmake、gnu make和手动编译的区别
【发布时间】:2014-10-03 00:25:40
【问题描述】:

我是编程新手,所以这是一个比技术问题更抽象的问题。我一直在使用 IDE 来学习,但我听说他们在创建可执行文件时倾向于过度简化编译、组装和链接的行为。

我正在尝试在不依赖 IDE(在本例中为 librocket)的情况下下载和编译库。我首先必须使用 Cmake 创建二进制文件。配置和生成后,在输出目录中没有看到任何目标文件或 .cpp 文件。然后我必须使用 gnu make 命令,然后在输出目录中创建目标文件和 .cpp 文件。

Cmake 和 gnu make 从下载源代码到实际创建目标文件的步骤是什么?编译器和链接器实际上是在什么时候调用的?

我已经成功编译了一个我编写的测试库,然后编译了另一个使用 g++ 链接到它的程序,但我有点迷茫,因为我必须使用 Cmake 和 gnu make 而不是直接调用编译器。

【问题讨论】:

  • 您应该能够编写库并使用您的库编写程序,而无需使用 make 或 Cmake。它们是非常高级的辅助工具。

标签: cmake gnu-make


【解决方案1】:

Cmake 是一个“项目生成器”。它实际上并没有构建任何目标文件等;它的作用是为其他工具(例如 GNU make)生成控制文件,这些工具将构建目标文件等。

使用 cmake 而不是直接编写 makefile 的好处是,使用相同的 cmake 输入文件,cmake 可以为各种不同的构建控制工具生成项目文件:除了 makefile,它还可以生成 Xcode(Mac OS X ) 项目文件、Microsoft Visual Studio 项目文件和其他工具(如 Ninja)的控制文件。如果您正在编写需要在许多不同平台上构建的软件,那么 cmake 通常是一个不错的选择。

对于您的情况,它是这样的:cmake 生成一组 makefile(仅)。当您有一个干净的工作区时,您通常只执行一次此操作。然后,当各种文件发生更改时,您运行 make,它使用这些 makefile 来根据需要调用编译器。如果任何 cmake 输入文件发生更改,makefile 也有重新运行 cmake 本身的规则。

【讨论】:

  • 归根结底,makefile 是否仍然执行带有一堆选项的 g++ 之类的编译器命令,还是完全执行其他操作来生成目标文件?
  • @krishtedemented 是的,make 确实使用一堆选项调用 g++,但前提是您提供了在 Makefile 中使用 g++ 的信息。您可以将make 视为一种脚本语言,用于从复杂的源代码树中自动构建具有许多(相互)依赖关系的程序。
  • @kristhedemented 是的,make 只是调用命令。它没有任何内置功能来编译任何东西。对于 cmake 生成的 makefile,如果您想查看 make 调用的命令,可以运行 make VERBOSE=1
【解决方案2】:

在编译包含大量文件的大型项目时,如果直接调用编译器,可能会丢失。

当然,您可以将相关命令放在脚本中并运行它,但是如果您添加/删除文件,则需要更新脚本。同样在这种情况下,您可能不希望每次进行小的更改时都重新编译所有内容,因此您只想编译已更改的部分。如果您在虚拟脚本中添加此(以及其他生活质量)功能,您将重新发明make

make 旨在仅运行在您上次调用 make 之前更改的代码部分的编译。它还允许您自动添加源文件等。

但是,如果您希望您的代码在多个不同的编译器上工作,在多个不同的平台上工作,并链接到不同的库等等,make 的事情会变得有点复杂。你仍然可以做到,但工作量很大。这就是cmake 的来源。

cmake 为您想要的系统构建 makefile(或类似的构建系统,例如:Visual Studio)。 cmake 为不同的编译器和系统预先构建了配置文件,这些配置文件将自动找到正确的编译器标志集,找到指向正确库的链接等等。

当然,如果您正在编写“Hello World!”或您不需要makecmake 的类似程序。如果您不需要支持多个编译器/平台,则不需要cmake。如果您正在开发一些大型库/应用程序,尽管 makecmake 会帮助您更轻松地完成工作。

【讨论】:

  • 写得很好。我一直在寻找这样的解释。
猜你喜欢
  • 2010-10-04
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
相关资源
最近更新 更多