【问题标题】:advantages of using make and Cmake instead of compiling from the commandline?使用 make 和 Cmake 而不是从命令行编译的优点?
【发布时间】:2018-04-29 23:01:19
【问题描述】:

我总是从命令行在 G++ 下编译我所有的 C++ 代码。

为什么人们使用Cmake和gcc make之类的东西,有什么优势?

如果真的有理由,我如何将我的项目转换为使用 makefile?

现在,我只使用一个文本文件,其中包含我需要分段编译项目的所有命令列表,当然,如果我想重新编译每个 c 和 cpp 文件,编译整个项目的那个.

【问题讨论】:

  • 在大型项目中,仅自动重新编译受最近更改影响的文件是一个优势。如果您有数千个源文件,重新编译所有文件可能需要一段时间。
  • 是的,但是 g++ 只允许您重新编译一个或 2 个或 3 个 c/cpp 文件。只需使用 -c
  • 您并不总是知道哪些.cpp 文件会受到您对头文件的更改的影响。这就是我们有依赖跟踪工具的原因。
  • 非常感谢大家!我应该引用人们的评论来回答我自己的问题,还是简单地将#1 回复标记为答案(供后代使用)?

标签: cmake gnu-make


【解决方案1】:

我只是使用一个包含编译项目所需的所有命令列表的文本文件...

这不是一个可移植的标准化解决方案,它是您个人工作流程所独有的。 MakefileCMakefile 允许您描述如何将代码编译到计算机,而不是人类,因此其他人可以运行一两个简单的命令并(希望)获得与你。

您的方法现在可能行得通,但是对于一个包含数千个源文件、数十万个错综复杂的交叉依赖项并且需要数小时编译的非平凡项目,您将需要自动化。

例如,您的文本文件可能包含:

 g++ input.cpp output -lstdc++

这是最简单的情况,一个源文件,一个输出文件,一个库。在非平凡代码中,命令如下所示:

g++ -m32 -c -g -Wall -Iinclude -Isrc -I../Perlingo\ Shared\ Objects -include include -fPIC  -MMD -MP -MF "build/Debug/GNU-Linux-x86/src/BhamEvent.o.d" -o build/Debug/GNU-Linux-x86/src/BhamEvent.o src/BhamEvent.cpp

这只是对您可能需要包含多少标志和选项以正确编译某些内容的尝试。其中一些路径是存储在Makefile 中的变量,或者由cmakeconfigure 等工具放入其中。

Makefile 的优点之一是您可以使用 -j8 等标志进行并行构建,最多可同时构建八件事。

【讨论】:

  • 我以为编译器告诉计算机如何编译我的代码
  • 编译器只能做它被告知的事情,并且通常编译一个文件需要包含一大堆并不总是显而易见的标志。 Makefile 就像一个批处理文件,但它也更聪明一点:它不会构建已经构建的东西,除非它们的依赖关系发生了变化。
  • 所以基本上 makefiles 自动化 g++ -c 调用?此外,究竟如何在项目不可移植的文件中传递命令行参数?您是否需要基于系统的不同参数?那不是一个糟糕的设计吗?
  • 告诉人们“这是你如何编译我的代码”作为一系列基于文本的指令真的很烦人,因为每个人都知道像 makecmake 这样的工具可以解决这个问题。我所说的“不可移植”的意思是那些指令可能在你的机器上工作,但其他机器需要不同的编译器标志或选项。这就是为什么存在像 configure 这样的工具来测试您正在使用的编译器、您拥有的库以及正确设置的原因。
  • 如果您想知道为什么存在自动化工具,请尝试构建一个大型开源项目。很好的例子包括Linux kernelChromeUnreal Engine
【解决方案2】:

您使用包含编译项目所需的所有命令列表的文本文件是通往托管构建的第一步。

让我们定义以下构建改进级别:

  1. 每次编译每个文件,依赖关系未知
  2. 集群文件到块或库中,仅在必要时构建
  3. 创建构建描述文件并使用makenmake
  4. 使用跨平台构建描述文件和cmake
  5. 使用可以基于 cmake 文件创建项目的 IDE

我使用级别 1 来简单演示问题和解决方案。但在我的项目中,我总是在第 5 级工作。看来您正在从第 2 级过渡到第 3 级。

【讨论】:

  • Codeblocks 给了我奇怪的编译结果(例如,它可以编译,但我编写的软件的某些功能……丢失了……就像我可以使用一些键但不是所有键都与 GLFW 一起使用。 .. 但 GLFW 的其余部分工作得非常好!)当然,在我使用 MSVC 之前我会被抓死
  • 对不起,但在您的问题中,您没有写任何关于 code::blocks 或任何其他 IDE 的内容。这是一个问答网站,而不是讨论论坛。如果你在 linux 上,我不知道你为什么写任何关于 MSVC 的东西。但我假设您不知道/喜欢/考虑/...任何其他 IDE。但你可以要求。
猜你喜欢
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多