1 什么是gcc

gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。

1.1 gcc编译程序的过程

gcc编译程序主要经过四个过程:

  • 预处理(Pre-Processing)
    预处理实际上是将头文件、宏进行展开。编译阶段,gcc调用不同语言的编译器,例如c语言调用编译器ccl。
  • 编译 (Compiling)
    gcc实际上是个工具链,在编译程序的过程中调用不同的工具。
  • 汇编 (Assembling)
    汇编阶段,gcc调用汇编器进行汇编。
  • 链接 (Linking)
    链接过程会将程序所需要的目标文件进行链接成可执行文件。

2 下载

1.官网-GCC, the GNU Compiler Collection GNU编译器集合包括C、c++、Objective-C、Fortran、Ada、Go和D的前端,以及这些语言的库(libstdc++,…)。GCC最初是作为GNU操作系统的编译器编写的。GNU系统是为100%的自由软件而开发的,在某种意义上说它是自由的,因为它尊重用户的自由。

Linux虚拟机安装centos8_GNU


上述官网好像找不到以前版本的Gcc了。2.gcc下载 以下为4.1.2版本gcc,可以看到,针对不同语言(如C、c++、Objective-C、Fortran、Ada、Go)有相应的安装包。

Linux虚拟机安装centos8_c++_02

3 安装

相⽐于windows系统,Linux安装程序就⽐较复杂了,很多需要root⽤户才能安装。常见的有以下⼏种安装⽅法:

  • 源码安装
  • rpm包安装
  • yum安装 (RedHat、CentOS)
  • apt-get安装 (debian,ubuntu)

3.1 源码安装

以安装gcc为例,上传gcc-X.X.X.tar.gz到Linux服务器任意⽬录,解压⽬录执⾏shell命令。

./configuration
make install
  • 优点:安装⽬录,软件版本等可以随⼼所欲的配置。同⼀个安装包可以在任意版本的Linux进⾏安装。
  • 缺点:安装的门槛较⾼,配置复杂,不同软件配置项⽬不同。安装容易失败。安装成功有时也会对原系统有破坏。

可供下载的文件一般有两种形式:gcc-X.X.X.tar.gz和gcc-X.X.X.tar.bz2,只是压缩格式不一样,内容完全一致,下载其中一种即可。
题外话】:Linux下的tar.gz和tar.bz2包有什么区别?
tar是打包软件,不压缩。
.gz是用tar打包的同时用gzip压缩,比如tar zcvf test.tgz /var
.bz2是用tar打包的同时用bunzip2压缩:tar jcvf test.tbz2 /var
bz2的压缩比要比gzip的压缩比高出一倍以上。

3.1.1 安装【gcc-4.0.4】

1.下载【gcc-4.0.4.tar.gz】

Linux虚拟机安装centos8_编译器_03


2.解压缩

运行下列命令进行解压

tar zxvf gcc-3.3.tar.gz

解压完成后,Downloads目录中多了【gcc-4.0.4】文件。

Linux虚拟机安装centos8_GNU_04


3. 建立目标目录

目标目录(用{objdir}表示)是用来存放编译结果的地方。GCC建议编译后的文件不要放在源目录{srcdir}中(虽然这样做也可以),最好单独存放在另外一个目录中,而且不能是{srcdir}的子目录。

下面在【Downloads】文件夹中新建【gcc-4.0.4-obj】文件夹,代码如下:

mkdir gcc-4.0.4-obj
cd gcc-4.0.4-obj

以下的操作主要是在目标目录 {objdir} 下进行。(否则会出错)

Linux虚拟机安装centos8_GNU_05


4.配置

配置的目的是决定将GCC编译器安装到什么地方({destdir}),支持什么语言以及指定其它一些选项等。其中,{destdir}不能与{objdir}或{srcdir}目录相同。

配置是通过执行{srcdir}下的configure来完成的。

源目录|目标目录|安装目录的总结说明如下:

Catalog

Note

Name

源目录

安装包位置

{srcdir}

目标目录

存放编译结果的地方

{objdir}

安装目录

安装位置

{destdir}

其命令格式为(记得用你的真实路径替换{destdir}):

{srcdir}/configure --prefix={destdir} [其它选项]

实际操作如下:

~/Downloads/gcc-4.0.4/configure --prefix=~/Downloads/gcc-4.0.4-obj --enable-threads=posix --disable-checking --enable--long-long --host=guest-dqehna --enable-language=c,c++

尝试1:在运行以下命令时:

../gcc-4.0.4/configure --prefix=~/Downloads/gcc-4.0.4-obj

Linux虚拟机安装centos8_c++_06


至此输入make运行,报错,信息如下:expected an absolute directory name(需要绝对目录名

Linux虚拟机安装centos8_编译器_07


更改代码如下:

../gcc-4.0.4/configure --prefix=/tmp/guest-dqehna/Downloads/gcc-4.0.4-obj --enable-threads=posix --disable-checking --enable--long-long --enable-language=c,c++

Linux虚拟机安装centos8_Linux虚拟机安装centos8_08


输入make,编译开始运行。但好像还是报错了,阿西吧!!!???

Linux虚拟机安装centos8_编译器_09


5.编译

make

6.安装

make install

3.1.2 安装【gcc-3.3】

1.下载【gcc-3.3.tar.gz】

Linux虚拟机安装centos8_编译器_10


2.解压缩

运行下列命令进行解压

tar zxvf gcc-3.3.tar.gz

Linux虚拟机安装centos8_编译器_11


but,解压好像出现了问题!阿西吧!是没有完全解压好么???为啥解压都会出问题?

Linux虚拟机安装centos8_c++_12

3.2 rpm包安装

常用命令参数:

  • 查看 rpm -qa
  • 安装 rpm -ivh 包名
  • 卸载 rpm -e 包名

下载rpm

RPM resource zipRPM Search

Linux虚拟机安装centos8_Linux虚拟机安装centos8_13


出现搜索结果:

Linux虚拟机安装centos8_Linux虚拟机安装centos8_14

点击第⼀个结果进⼊详情界⾯,可以看到rpm包的具体信息,包括依赖以及包⾥内容

Linux虚拟机安装centos8_c语言_15

  • 优点:安装时⽆需配置,可以选择版本。
  • 缺点:安装包的依赖关系需要⼈⼯维护,安装A发现依赖B,安装B发现依赖C…很考验耐⼼。

3.2.2 rpm包命名规则

gcc-c+±4.1.2-48.el5.i386.rpm是按照下⾯的格式命名的
name-version -arch(.src).rpm

  • name: 软件包名称
  • version: 带有主、次和修订的软件包版本
  • arch: 发⾏商版本,fc、el、mga、tr……硬件平台,硬件平台包括了:i386、i486、i586、i686、x86_64、ppc、sparc、alpha
  • src: 源代码包

3.3 yum(RedHat、CentOS)

基于RPM包管理,能够从指定的服务器⾃动下载RPM包并且安装,可以⾃动处理依赖性关系,并且⼀次安装所有依赖的软件。

yum install gdb
  • 优点是⾃动管理依赖关系。
  • 缺点是需要连接公共⽹络,安装的是指定服务器上的最新版本。

3.4 apt-get(debian,ubuntu)

apt-get是⼀条Linux命令,适⽤于deb包管理式的操作系统,主要⽤于⾃动从互联⽹的软件仓库中搜索、安装、升级、卸载软件或操作系统。

apt-get install gdb

执行上述命令后报错,

Linux虚拟机安装centos8_c语言_16


错误原因如下:

Linux虚拟机安装centos8_编译器_17


查找结果方案如下:但依然报错

Linux虚拟机安装centos8_c++_18

4 Test

4.1 C语言

#include 
int main(void) { 
printf("ad"); 
return 1; 
} 

gcc -o aa aa.c

4.2 C++

#include 
using namespace std; 
int main(void) { 
 cout << "Ok!" << endl; 
 return 1; 
} 

g++ -o a a.cpp

5 其它

查看gcc版本

gcc --version

5.1 使用外部库

在使用C语言和其他语言进行程序设计的时候,我们需要头文件来提供对常数的定义和对系统及库函数调用的声明。库文件是一些预先编译好的函数集合,那些函数都是按照可重用原则编写的。它们通常由一组互相关联的可重用原则编写的,它们通常由一组互相关联的用来完成某项常见工作的函数构成。使用库的优点在于:

  • 模块化的开发
  • 可重用性
  • 可维护性

库又可以分为静态库与动态库:

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。静态库比较占用磁盘空间,而且程序不可以共享静态库。运行时也是比较占内存的,因为每个程序都包含了一份静态库。
  • 动态库(.so或.sa):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码,这样就减少了程序的体积。

一般头文件或库文件的位置在:

  • /usr/include及其子目录底下的include文件夹
  • /usr/local/include及其子目录底下的include文件夹
  • /usr/lib
  • /usr/local/lib
  • /lib