Linux – gcc 和g++

服务器

浏览数:43

2020-6-10

AD:资源代下载服务

检查和安装

查看是否有安装

which gcc
which g++
which gdb

查看版本号

gcc -version

安装

从网上下载一个包
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
在包中选择要下载的东西

yum install gcc
yum install g++
yum install gdb

gcc的介绍

本质:
linux是把.c文件 转化为.out可执行文件 ->ELF格式
window下,是把.c文件转化为.exe可执行文件

gcc:四个过程


编译阶段:

预编译: gcc -E file.c -o file.i

 .c文件 转化为 .i文件


编译: gcc -S file.i


生成一个 .s文件 ,变成汇编程序


汇编:  gcc -c main.s


生成一个.o文件,可
重定位的二进制文件

连接阶段:

连接: gcc -o newname oldname.o


生成了一个可执行文件newname

   
gcc file.o

  默认生成了可执行文件a.out

因为下面的操作覆盖上面的操作,

gcc -E name.c  //得到.i文件
gcc -S name.c  //得到.s文件
gcc -c name.c  //得到.o文件
gcc -o name.c  //得到.out文件

常用用法:

单文件

gcc -o filename oldname.c
//此时filename是.out执行文件,而不是.c
执行文件: 编译完了之后运行该程序即可

[root@localhost 2020-3-7]# vim hello.c
[root@localhost 2020-3-7]# gcc -o newname hello.c[root@localhost 2020-3-7]# ls
hello.c  newname
[root@localhost 2020-3-7]# ./newname
hello
[root@localhost 2020-3-7]# 
多个文件编译连接成一个.out

gcc -o projectname main.c file.c file2.c
//注意事项:一个工程中只能有一个main函数

不同语言在四个过程下的不同

c语言与C++编译的不同:

C语言在函数前只需要加下划线即可/C++还需要看他的参数顺序,参数个数,参数类型等,所以才有了函数的重载的概念

java与c类语言在汇编的不同

java在汇编过程中,存在一个虚拟机的概念 .class需要gbm去读取执行,优点是可以跨平台,本质是在不同平台上提供了不同的解释器

C++就不需要,可以直接把汇编指令翻译成二进制,缺点就是不能跨平台,优势是速度快

《程序员的自我修养》

.o文件 (ELF格式)

o文件的组成

readelf -h main.o  //查看头部的信息
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
....
  Size of this header:    64 (bytes)
....
objdump -h main.o //查看文件的段分布
main.o:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         0000000d  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000014  0000000000000000  0000000000000000  00000050  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          0000000c  0000000000000000  0000000000000000  00000064  2**2
                  ALLOC
  3 .comment      0000002e  0000000000000000  0000000000000000  00000064  2**0
                  CONTENTS, READONLY
  4 .note.GNU-stack 00000000  0000000000000000  0000000000000000  00000092  2**0
                  CONTENTS, READONLY
  5 .eh_frame     00000038  0000000000000000  0000000000000000  00000098  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

.bss是.data的一部分


.text 存放指令


.data 存放数据

把重定位二进制文件.o进行连接

在汇编后,会生成多个可重定位的二进制文件

多个.c/.cpp文件,都是独立编译的,在连接过程中在组装到一起

在其中一个.o文件中可能需要其他.o文件的方法

这个时候就需要重定位,把调用点的标识,改成需要调用的地址

让该方法最终在其他文件中可以被使用

什么属于数据?

数据:全局变量和静态变量,且初始化不为零
函数内部的非static变量,是指令

gcc和g++的区别

gcc 默认连接 C库,把.cpp和.c分开编译
g++ 默认连接C++,都当做.cpp来编译
他们俩是相通的

//如果非要用gcc编译.cpp文件,命令把C++库加上就行
gcc main.cpp -o main -lstdc++

g++和gcc指令一致,文章中g++替换gcc即可

常见错误

错误-未定义符号:gcc编译链接时,少了某些文件
linux下定义(实现) :必须包含.c文件,所以纯.h文件是会报错的

作者:Akuaner