Linux下c++开发环境之GCC编译器

目录

1. 概念介绍

1.1 GCC

1.2 GNU

1.3 自由软件基金会

1.4 Linux内核

1.5 MinGW

2. 编译过程

3. g++编译选项介绍

4. make&cmake介绍


1. 概念介绍

1.1 GCC

  • 全称GNU Compiler Collection,即GNU编译器套件,其初衷是为GNU操作系统专门编写一款编译器,但已被大多数类Unix操作系统(如Linux\BSD\MacOS X等)采纳为标准的编译器,甚至在微软的Windows上也可以使用GCC。 
  • GCC原名为GNU C Compiler,开始只能处理C语言,后来扩展可支持C++,Fortan、Objective-C、Java、Go以及各类处理器架构上的汇编语言等。
  •  GCC支持多种计算机体系结构芯片,如x86、ARM、MIPS等,并已被移植到其他多种硬件平台。该部分内容摘自gcc(GNU编译器套件)_百度百科

1.2 GNU

  • GNU's Not Unix!的缩写,是一个自由的操作系统,其内容软件完全以GPL方式发布。GNU的设计类似Unix(一种广泛使用的商业操作系统),但不包含具著作权的Unix代码
  • 作为操作系统,GNU的内核称为Hurd,是自由软件基金会发展的重点,但是其发展尚未成熟,在实际使用上,多半使用Linux内核、FreeBSD等替代方案,作为系统核心,其中主要的操作系统是Linux的发行版。Linux操作系统包含了Linux内核与其他自由软件项目中的GNU组件和软件,可以被称为GNU/Linux
  • 该系统的基本组成包括GNU编译器套装(GCC)、GNU的C库(glibc)、以及GNU核心工具组(coreutils),另外也是GNU除错器(GDB)、GNU二进制实用程序(binutils)的GNU Cashshell中和GNOME桌面环境。GNU开发人员已经向GNU应用程序和工具的Linux移植,也广泛应用在其它操作系统中使用。该部分内容摘自GNU_百度百科

1.3 自由软件基金会

  • FSF-Free Software Foundation,是一个致力于推广自由软件、促进计算机用户自由的美国民间非盈利性组织。于1985年10月由理查德·斯托曼建立。其主要工作是执行GNU计划,开发更多的自由软件,完善自由软件。该部分内容摘自自由软件基金会_百度百科

1.4 Linux内核

  • Linux是一种开源电脑操作系统内核。用C语言写成,最早是由芬兰Linus Torvalds为尝试在英特尔x86架构上提供自由的类Unix操作系统而开发的。
  • 操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。
  • Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。该部分内容摘自Linux内核_百度百科

1.5 MinGW

  • Minimalist GNU for Windows,在Windows环境下将源代码文件编译成可以在Windows系统中运行的可执行.exe程序

       本小节以编译器展开,其实质是翻译代码为计算机语言的工具。计算机的CPU架构不同,代码想要在上面执行时需要编译器对代码进行编译汇编链接。汇编和链接的过程对每个不同的平台上过程都不一样。对于同样硬件平台,不同操作系统,如同样硬件的ubuntu系统和windows系统,同一套代码要想编译成各自系统能执行的程序,在将源文件编译为目标文件的过程应该是一样的,因为它们都是在x86平台运行,其各命令对应的机器码应该是一样的,只不过编译成目标文件之后还要将其转换成在运行环境中可执行的程序,如windows下的程序一般都是exe,linux下编译成.out,所以不同的应该从目标文件到可执行程序这一部分不同运行环境下的特殊包装处理(这一部分不是很确定,只是个人理解)。参考机器码、CPU指令集、汇编指令集、操作系统、API接口、C标准库的关系。_百度知道

2. 编译过程

        由于计算机只认识0和1,一个用c++开发的程序要想在计算机中运行,需要将其转换成二进制的机器码,编译器就是做这件事。将源程序编译成目标程序,一般包括:

1) 预处理 - 处理预编译指令,如#include 、#define等,删除注释,添加行号(这一部分不是很确定,只是个人理解)(这一部分不是很确定,只是个人理解)(这一部分不是很确定,只是个人理解)和文件名标识

2) 编译&汇编 - 将高级语言编写的源程序先转换成汇编语言文件,然后根据汇编语言和机器码的对应关系,将由汇编语言文件转换成机器可以识别的机器码(二进制)文件,也称为目标文件。该过程一般要进行五部分内容:词法分析、语法分析、语义检查和中间代码生成、代码优化、目标代码生成。

3) 链接 - 将2)生成的目标文件链接成可执行文件

      上述为编译器编译过程主要的操作,但对于一个大型的项目,编译器在开始编译工作之前,需要知道如何对源代码进行编译,如需不需要对代码进行优化,需要的c++最低版本等,我们需要先对编译选项进行配置。编译器需要知道当前的系统环境,比如标准库在哪里,软件的安装的位置在哪里,需要安装哪些组件等等。不同的计算机系统环境不一样,通过指定编译参数,编译器可以灵活的适应环境,编译出各种环境都能运行的程序。

       另外,当项目代码中用到标准库函数和头文件时,需要告诉编译器这些库文件的位置,一般配置文件会列出目录,编译时,编译器按顺序在目录中寻找目标。

       除此之外,编译器在编译开始之前,需要知道项目代码之间的依赖关系,即需要知道先编哪个文件,在编哪个文件。该部分内容参考菜鸟教程文档,感觉菜鸟教程中讲的很清楚。

编译器的工作过程 | 菜鸟教程

3. g++编译选项介绍

1) 预编译,由预处理器cpp完成,将.cpp文件预处理为.i文件,参数选项为-E

      g++ -E temp.cpp -o temp.i

2) 编译,由编译器cc1plus完成,将.i文件编译为.s的汇编文件,参数选项为-S

       g++ -S temp.i -o temp.s

3) 汇编,由汇编器as完成,将.s文件汇编成二进制目标文件,参数选项为-c

       g++ -c temp.s -o temp.o

4) 链接,由连接器ld完成,将.o文件链接成可执行文件

      g++ temp.o -o temp.out

       除了上述参数选项,一般在编译过程中,g++还提供了很多参数选项,如告诉编译器去哪里搜索自己定义的头文件和生成的库文件,以及是否需要对代码进行优化,是否需要编译成debug版本,其他参数选项可参考g++入门教程 - 云+社区 - 腾讯云 和 gcc官方手册  https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc.pdf

4. make&cmake介绍

        对于源文件个数不多的项目,可直接通过g++命令加上对应的参数选项,完成对工程代码的编译,但是对于有很多源文件的项目,如果还通过g++命令就会显得不是太灵活,于是便诞生了GNU Make工具,该工具通过make命令,读入一个名为makefile的文件,然后执行这个文件中指定的指令。个人理解makefile本质上是对g++命令和参数选项的封装。

        在大型工程代码项目中,手写makefile文件也不是一件很轻松的事情,为了让这个事情变得简单,便出现了cmake工具,该工具可以通过简单的语句来描述编译过程,他能够生成对应的makefile文件,前提是需要手写CMakeLists.txt。

其他参考内容gcc/gdb/MinGW/makefile/cmake - whycantusee - 博客园

总结:上述内容为本人在学习基于linux环境开发c++代码过程中的学习总结,大部分内容摘自网上其他前辈整理的内容,但是按照自己在学习这块内容时所连带衍生出来的疑惑,通过查阅资料,对各部分疑惑内容进行了汇总,一方面可以加深理解,方便日后翻阅,另一方面也希望其他小伙伴阅读到该文档时对其有所帮助。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值