安装 gcc
1.打开终端:
2.切换到root用户: su 输入密码 切换到root
3.切换当前工作目录: cd /mnt
mnt是一个临时挂载点 ISO镜像–>/dev 接口
4.创建目录: mkdir dvd
接口挂载到dvd下面
5.挂载: mount /dev/cdrom /mnt/dvd
mount是个命令 把cdrom里的东西挂载在dvd 相当于映射进去
6.切换到yum的配置文件: cd /etc/yum.repos.d
7.创建配置文件: touch yum.repo
8.编辑配置文件: vim yum.repo
填入以下代码:
9.寻找要装的gcc安装包: yum search gcc
10.进行安装: yum install gcc-c++.i686 -y
11.complete后进行验证:
which gcc
which g++
which gdb
12.退出:exit
yum安装有三种方式:
本地安装: baseurl=file://
flp安装: baseurl=flp://
网络安装: baseurl=http://
我们用的本地安装
编译连接原理.
1.预编译:
删除注释
宏替换
预编译指令:#include #if #elif #endif
2.编译:
词法,语法,语义的解析
代码优化
符号汇总(数据和函数名会生成符号)
3.汇编:
将汇编指令转化为二进制
生成各个section
生成符号表
4.链接:
合并各个section,调整段大小及段的起始位置,合并符号表,进行符号解析
符号解析只会解析GLABAL符号,不解析LOCAL符号
符号重定位(给所有的符号一个运行时的逻辑地址,逻辑地址是假地址)
链接之后是一个可执行文件—>在磁盘上存储的
注意:
只有物理地址才是真正的内存地址.操作系统将可执行文件加载到内存上后,加载位置不一定,但是可以通过虚拟内存技术将逻辑地址转化为一个物理地址,就可以直接访问.
在终端进行执行:
预编译:
gcc-E main.c -o main.i
编译:
gcc -S main.i 从main.i到 main.s
gcc -S main.c—>从main.c到 main.s
汇编:
gcc -c main.s
gcc -c main.c—>main.o
链接:
gcc main.o–>生成一个a.out
gcc main.c–>a.out
gcc main.o -o main
int main(int argc,charargv[],charenvp[]);
.bss分为:磁盘空间和内存空间 节省的是磁盘空间
malloc:返回虚拟地址,指向的仅仅是一块虚拟地址空间.(在物理内存上没有申请到空间,只有当真正赋值时才会将内存分配给它----叫做惰性原理)
malloc调用特别快.
new:相当于是对malloc的一次封装
内存构建
内存构建:
.data数据区存储: 初始化并且不为0
.bss 数据区存储: 初始化为0或者未初始化的数据,除过未初始化的普通全局变量
举例:(可以看到哪些是指令 哪些是数据)
gcc g++区别
gcc g++:编译连接,都能编译C也能编译C++
gcc: 默认链接C库
g++:默认链接C++库
gdb:调试
gcc g++区别:
1.g++在编译C的时候不用手动链接C库也可以用编译
如果用gcc来编译c++程序,必须手动链接 C++库
gcc -o main main.cpp -lstdc++ 正确
gcc -o main main.cpp这样就会出问题(.cpp是c++程序)
gcc -o main main.c 这样不会出问题
2.对于.c文件,gcc以C语言方式处理,g++以c++语言方式处理.
3.对于.cpp文件,gcc和g++都以C++方式处理,但是gcc不会链接STL库,必须手工链接
两个版本
1.debug版本–>开发版本,调试版本,最终的可执行文件中加入了很多调试信息,在section
gcc -o main.o main.c -g 得到一个debug版本的文件main.o
分步解析:
先编译: gcc -c main.c -g
链接: gcc -o debug main.o
要注意-g是加在编译过程中的,如果加在了连接过程生成的是release版本
2.release版本–>发行版本
gcc 默认生成release版本
调试:
gdb main.o
注意:
调试的对象是:debug版本的可执行文件 gdb main.o(这个main.o已经是debug版本的)
控制的对象: .c文件
显示源代码:
l : 显示main函数所在的文件的源代码
list file_name:num 显示指定文指定行附近的代码
set listsize count 设置一次显示的行数
list line1,line2 显示从 line1到line2之间的代码
断点管理:
1.b line 给line行设置一个断点,但是加了断点不会显示加了
2.info b 查看断点信息
3.b file_name:line 给file_name的line行设置一个断点
4.b function_name 给函数的第一行设置一个断点
5.d bpnum 删除line行的断点
6.disable bpnum 将断点设置为无效
7.enable bpnum 将断点设置为有效
8.b line/file_name:line/function_name if 条件 添加条件断点
运行流程管理:
r 启动调试
n 执行下一步 逐过程–>遇到函数调用则直接将函数执行完成,进行下一步
s 执行下一步 逐语句–>遇到函数调用则进入函数中单步执行
finish 跳出函数–>仅仅将当前的函数执行完成,然后暂停下来
c 继续执行,直到下一个断点处
q 退出调试
查看变量:
p val_name(变量名)
p &val_name(引用)
p s_node.data(节点)
p p_s->data(指针指向的数据)
p *p_s(指针)
数组:
int arr[] = {1,2,3,4,5,6};
int *parr= arr;
查看数组:
p arr 将数组的所有元素打印出来
p parr 显示数组的首地址
p *parr 显示数组首元素的地址
p *parr@len 显示从parr地址开始到len长度的元素的值
p function(c1,c2,c3) 显示函数调用完成后返回的值
call
查看函数调用栈:
bt 到此刻为止,函数调用的过程
display val_name 每执行一步就会自动显示规定的动作
info display 显示display信息
UN