Cmake,gnu make与手动编译之间的差异

问题描述 投票:28回答:2

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

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

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

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

cmake gnu-make
2个回答
30
投票

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

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

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


0
投票

当编译包含许多文件的大型项目时,如果直接调用编译器,则可能会迷路。

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

make设计为仅运行直到最后一次调用make之前已更改的代码部分的编译。它还允许您自动添加源文件等。

但是,如果您想让代码与几种不同的编译器一起工作,并在几种不同的平台上工作,并链接到不同的库等,对于make,事情会变得有些复杂。您仍然可以做到,但这是很多工作。这是cmake出现的位置。

cmake为所需的系统生成makefile(或类似的生成系统,例如:Visual Studio)。 cmake具有针对不同编译器和系统的预构建配置文件,这些配置文件将自动找到正确的编译器标志集,找到指向正确库的链接,等等。

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

© www.soinside.com 2019 - 2024. All rights reserved.