检查和安装
查看是否有安装
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文件是会报错的
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。