首页 > 其他分享 >gcc make cmake ninja的区别

gcc make cmake ninja的区别

时间:2023-08-19 15:23:39浏览次数:49  
标签:文件 gcc cmake make makefile 编译 Ninja ninja

理清C++编译过程用到的工具概念

ref: GCC、CMake、CMakelist、Make、Makefile、Ninja啥关系?一图讲透! - 知乎 (zhihu.com)

早先学C++的时候,因为只需要点击IDE的运行按钮,程序就可以跑起来,写过最复杂的只不过是几个文件的学生管理系统。

现在要重新拾起C++,看的项目和之前的不可同日而语,构建系统也复杂的多。要补课了。

GCC

一切的开始

1987年,被称作“最伟大的程序员” “自由软件之父” 的 Richard Stallman完成了C语言编译器初版,称之为GNU C Complier(GNU,GNU's Not Unix! ,是一个操作系统)。后来GCC快速发展,除了能编译C,还能编译C++,Fortran,Pascal,Objective-C,Java以及Ada等语言。

make & makefile

新的麻烦!

一个软件工程的发展导致包含的源文件越来越多,但是GCC只能逐个手动编译。于是Richard Stallman和Roland McGrarth共同开发了make和makefile来解决这个问题。

  • make工具可以看作一个智能的批处理工具,它本身没有编译和链接的功能,而是用类似于批处理的方式,通过调用makefile中用户指定的命令来编译和链接。

  • makefile 是一个脚本文件,里面包含了调用 gcc (或者别的编译器)编译某个源文件的命令。

Cmake & CMakelist

更多的麻烦

本质上讲,makefile还是需要人工编写,当一个软件工程非常非常大时,这也是一个麻烦。另一方面,makefile中的脚本是平台相关的,在makefile发展过程中,陆陆续续出现了各种不同平台的makefile,有GNU make、QT 的 qmake,微软的 MSnmake,BSD Make(pmake),Makepp等等。这就导致如果换用不同的平台编译,就需要依据这个平台重新编写makefile,结果让麻烦变得更大。

于是,Cmake出现了。Cmake可以更加简单的生成makefile文件,最重要的是可以跨平台生成对应的makefile文件,不需要在进行修改。也就是说CMake是跨平台的。CMakelist文件则是Cmake工具生成makefile文件的依据,它还是需要我们自己写的。

Ninja

麻烦不止

到目前位置,软件工程变大的编译问题,跨平台问题暂时得到了解决,但还有一个问题尚未得到解决,那就是make执行速度慢的问题越来越严重了。

于是Google的一名程序员推出了注重速度的构建工具Ninja。Ninja启动编译的速度非常快,因为他舍弃了各种高级功能,语法和用法非常简单。

实际测试下,超过30000个源文件,Ninja可以在1秒钟内开始真正的构建,而使用makefile文件则需要10-20秒。

暂时完美的结局

只是暂时

Cmake可以生成 .ninja 和.makefile 的工具。因为担心很多人不熟悉makefile文件和ninja文件的写法,所以cmake只需要用户通过对源码文件的简单描述(就是CMakeLists.txt文件),就能自动生成一个project的makefile文件或者ninja文件,然后就可以通过ninja或者make进行启动编译了。

标签:文件,gcc,cmake,make,makefile,编译,Ninja,ninja
From: https://www.cnblogs.com/heymeteor/p/17642496.html

相关文章

  • linux下gcc/g++创建一个共享库项目以及创建一个可执行项目动态链接该共享库
    1.先确保有g++命令2.创建一个c++项目目录,并cd到该目录3.创建共享库头文件:dynamic_so.h#ifndef__TEST__#define__TEST__inttestFun(inta,intb);#endif4.创建对应共享库的实现文件:dynamic_so.cpp#include"dynamic_so.h"inttestFun(inta,intb){returna......
  • ubuntu 下 GCC/G++ 的 include 搜索路径查看与设置
    https://blog.csdn.net/quicmous/article/details/106790319 一、如何查看include搜索路径输入如下命令:>echo'main(){}'|gcc-E-v-1显示结果如下:Usingbuilt-inspecs.COLLECT_GCC=gccOFFLOAD_TARGET_NAMES=nvptx-noneOFFLOAD_TARGET_DEFAULT=1Target:x86_64-linux-gn......
  • Wiindows下更改CMake编译器为MinGW
    个人环境MinGW:使用QT6install的mingw1120_64.CMake:使用QT6install的CMake3.24.2.第一次编译时,默认生成VS的工程文件,为了修改编译器为MinGW,在编译时,键入:cmake-G"MinGWMakefiles"-DCMAKE_CXX_FLAGES=-std=c++11同时也指定了编译器支持的编译标准为c++11注......
  • cmake随笔
    cmakecmake命令使用##配置projectcmake[<options>]<path-to-source>`常用选项:-S<path-to-source>:指定源文件根目录-B<path-to-build>:指定构建文件目录-G<generator-name>:指定生成器。具体支持哪些生成器可用-DCMAKE_BUILD_TYPE=Debug:配置debug版-DCMAKE_BUI......
  • CMakeLists语法详解
     https://www.jianshu.com/p/eb25baf5ca19set(Root"${CMAKE_CURRENT_SOURCE_DIR}")set(Base64${Root}/lib/libb64/src)include_directories(${OpenCV_INCLUDE_DIRS})include_directories(${Root})include_directories(${Root}/lib/libb64/include) include_dir......
  • GCC options: compare -nostartfiles, -nodefaultlibs, -nolibc
    GNU不同编译选项的区别nostartfiles不使用启动文件,默认使用库nodefaultlibs不使用默认库,默认使用启动文件nostdlib不使用启动文件,不使用默认库nolibc不使用启动文件,不使用与系统库紧耦合的库-nostartfiles-nodefaultlibs-nolibc-nostdlib/usr/lib/Scrt1.o......
  • VSCode C++开发环境配置:CMake 调试配置 launch.json
    相关内容VSCodeC++开发环境配置:LLVMclangclangd安装cmakesudoaptinstallcmake安装VSCode插件CMakeCMakeTools编写CMakeLists.txtproject(hello)cmake_minimum_required(VERSION3.15.0)set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_EXTENSIONSOFF)add......
  • gcc多版本共存
    有时候编译项目时会遇到需要特定编译器版本的情况,可以使用update-alternatives来解决这个问题。以gcc9与gcc11共存为例。首先查看本机已安装的编译器版本,可以看到已安装版本为gcc-11ls/usr/bin/gcc*安装需要的gcc版本,这里安装gcc-9sudoaptinstallgcc-9安装完成后使用......
  • 基于Field_II_ver_3_24_windows_gcc工具箱的超声波二维成像与三维成像matlab仿真
    1.算法理论概述1.1超声波成像的基本原理       超声波成像是一种通过超声波对物体进行成像的技术。超声波成像的原理是利用超声波在不同组织之间传播速度不同的特点,探测物体内部的结构。超声波成像可以分为二维成像和三维成像两种。二维成像是将超声波探头沿一个方向......
  • C99 Clion 项目目录结构 CMakeLists.txt
    简单helle目录如下.├──CMakeLists.txt├──hello│  └──hello.c└──main.cmain.c#include"hello//hello.c"intmain(){print_hello();return0;}hello.c#include<stdio.h>staticvoidprint_hello();voidprint_hello(){pr......