linux gcc的连接,Linux基础-gcc安装&编译连接原理

安装 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

填入以下代码:

6c1555302777729326ca3efa0910d9ec.png

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://

我们用的本地安装

编译连接原理.

6c1555302777729326ca3efa0910d9ec.png

1.预编译:

删除注释

宏替换

预编译指令:#include #if #elif #endif

2.编译:

词法,语法,语义的解析

代码优化

符号汇总(数据和函数名会生成符号)

3.汇编:

将汇编指令转化为二进制

生成各个section

生成符号表

4.链接:

合并各个section,调整段大小及段的起始位置,合并符号表,进行符号解析

6c1555302777729326ca3efa0910d9ec.png

符号解析只会解析GLABAL符号,不解析LOCAL符号

符号重定位(给所有的符号一个运行时的逻辑地址,逻辑地址是假地址)

链接之后是一个可执行文件—>在磁盘上存储的

6c1555302777729326ca3efa0910d9ec.png

注意:

只有物理地址才是真正的内存地址.操作系统将可执行文件加载到内存上后,加载位置不一定,但是可以通过虚拟内存技术将逻辑地址转化为一个物理地址,就可以直接访问.

在终端进行执行:

预编译:

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的一次封装

内存构建

内存构建:

6c1555302777729326ca3efa0910d9ec.png

.data数据区存储: 初始化并且不为0

.bss 数据区存储: 初始化为0或者未初始化的数据,除过未初始化的普通全局变量

举例:(可以看到哪些是指令 哪些是数据)

6c1555302777729326ca3efa0910d9ec.png

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值