Cmake,gnu make和手动编译之间的区别

kri*_*ted 26 cmake gnu-make

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

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

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

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

Mad*_*ist 28

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的规则.

  • @kristhedemented yes,make只调用命令.它没有任何编译任何东西的内置功能.对于由cmake生成的makefile,如果要查看make调用的命令,可以运行`make VERBOSE = 1`. (5认同)
  • @krishtedemented是的,`make`确实用一堆选项调用`g ++`,但前提是你在Makefile中提供了使用`g ++`的信息.您可以将`make`视为一种脚本语言,用于构建具有来自复杂源树的许多(相互)依赖项的程序的自动化. (4认同)
  • 在一天结束时,makefile是否仍然使用一堆选项执行像g ++这样的编译器命令,或者它是否完全用于生成目标文件? (2认同)

小智 11

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

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

make旨在仅运行在上次调用make. 它还允许您自动添加源文件等。

但是,如果您希望您的代码在多个不同的编译器和多个不同的平台上工作,并链接到不同的库等,那么make. 你仍然可以这样做,但这是很多工作。这是来的地方cmake

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

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