使用make和Cmake而不是从命令行编译的优点? 我总是从命令行编译G++中的所有C++代码。< /P>

使用make和Cmake而不是从命令行编译的优点? 我总是从命令行编译G++中的所有C++代码。< /P>,cmake,gnu-make,Cmake,Gnu Make,为什么人们使用像Cmake和gcc make这样的东西,其优点是什么 如果确实有理由,我如何将我的项目转换为使用makefiles 现在,我只使用一个文本文件,其中列出了编译项目所需的所有命令,当然,如果我想重新编译每个c和cpp文件,也就是编译整个项目的文件 我只是使用一个文本文件,其中列出了编译项目所需的所有命令 这不是一个可移植的、标准化的解决方案,它是您个人工作流程所独有的。Makefile或CMakefile允许您描述如何将代码编译到计算机,而不是人类,以便其他人可以运行一两个简单的命

为什么人们使用像Cmake和gcc make这样的东西,其优点是什么

如果确实有理由,我如何将我的项目转换为使用makefiles

现在,我只使用一个文本文件,其中列出了编译项目所需的所有命令,当然,如果我想重新编译每个c和cpp文件,也就是编译整个项目的文件

我只是使用一个文本文件,其中列出了编译项目所需的所有命令

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

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

例如,您的文本文件可能有:

 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
中的变量,或者通过
cmake
configure
等工具放入其中


Makefile
的另一个优点是,您可以使用像
-j8
这样的标志进行并行构建,它最多可以同时构建八件事情。

您使用文本文件以及编译项目所需的所有命令列表,这是实现托管构建的一个步骤

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

  • 每次编译每个文件时,依赖项都是未知的
  • 将文件群集到块或LIB以仅在必要时生成
  • 创建生成描述文件并使用
    make
    nmake
  • 使用跨平台构建描述文件和
    cmake
  • 使用可以基于cmake文件创建项目的IDE

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

    我以为编译器告诉了计算机如何编译我的代码。编译器只能做它告诉的事情,而且编译文件通常需要包含一大堆并不总是明显的标志。一个
    Makefile
    就像一个批处理文件,但它也有点聪明:它不会构建已经构建的东西,除非它们的依赖关系发生了变化。那么Makefile基本上会自动执行g++-c调用吗?另外,在项目不可移植的文件中传递命令行参数的确切方式是什么?您是否需要基于系统的不同参数?这不是一个糟糕的设计吗?告诉人们“这是如何编译我的代码”作为一系列基于文本的指令真的很烦人,因为每个人都知道像
    make
    cmake
    这样的工具可以解决这个问题。我所说的“不可移植”是指那些指令可能在您的机器上工作,但其他机器需要不同的编译器标志或选项。这就是为什么像
    configure
    这样的工具可以用来测试你正在使用的编译器,你拥有的库,并正确设置。如果你想知道为什么会有自动化工具,试着构建一个大型开源项目。很好的例子包括,或。在大型项目中,仅自动重新编译受最近更改影响的文件是一个优势。如果你有数千个源文件,重新编译所有的可能需要一段时间。是的,但是g++只允许你重新编译一个或2个或3个c/cpp文件。只需使用-cYou并不总是知道头文件的更改会影响哪些
    .cpp
    文件。这就是为什么我们有依赖性跟踪工具。非常感谢你们,所有人!我应该引用人们的评论来回答我自己的问题,还是简单地将#1回答标记为答案(对于后代)?代码块给了我奇怪的编译结果(如中所述,它可以编译,但我编写的软件的某些功能……缺失……就像我可以使用一些键,但不是所有键都可以与GLFW一起使用……但GLFW的其余部分工作得非常好!)当然,在我使用MSVC之前,我会被当场抓住对不起,但在你的问题中,你没有写任何关于code::blocks或任何其他IDE的内容。这是一个问答网站,不是一个讨论论坛。我不知道如果你在linux上,你为什么要写任何关于MSVC的内容。但我假设你不知道/喜欢/考虑/任何其他IDE。但你可以要求这样做。