首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cmake、gnu make与手工编译的区别

Cmake、gnu make与手工编译的区别
EN

Stack Overflow用户
提问于 2014-08-10 02:44:45
回答 2查看 25.1K关注 0票数 40

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2014-08-10 03:19:57

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

如果您编写的软件需要构建在许多不同的平台上,那么cmake通常是一个很好的选择。

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

票数 45
EN

Stack Overflow用户

发布于 2020-01-07 20:07:02

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

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

make被设计为只运行在您上次调用make之前更改过的代码部分的编译。它还允许你自动添加源文件等。

但是,如果您希望您的代码在几个不同的编译器和几个不同的平台上工作,并链接到不同的库等等,那么对于make来说事情就有点复杂了。你仍然可以做到这一点,但这是一项大量的工作。

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

当然,如果你正在写一个"Hello World!“或者类似的程序,你既不需要make也不需要cmake。如果你不需要支持多个编译器/平台,你就不需要cmake。但是,如果您正在开发一些大型的库/应用程序,makecmake将帮助您更轻松地完成工作。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25221869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档