gcc/g++ 的使用

————gcc:只能编译c语言

————g++:c++和c都可以编译

当然,c语言编译还是推荐gcc。

在学习gcc/g++之前,我们要先了解一些知识点:

一、背景知识

1,预处理

gcc -E就是告诉编译器到预处理阶段就停下来,-o后面跟的是文件名,.i是预处理后的文件后缀。

a,去注释

b,头文件展开

c,宏替换

d,条件编译

可以看到头文件展开后行号来到了八百多行。

在Linux中,头文件已经提前准备好

例:(输入指令  ls/user/include/)

2,编译(生成汇编)

gcc -S:就是告诉编译器到编译阶段就停下来、.s就是编译的文件后缀

3,汇编(生成机器可识别码)

gcc -c:告诉编译器到汇编时就停下来,.o是汇编之后的文件后缀:

编译完之后属于二进制文件,可重定向目标二进制文件,简称目标文件,虽然已经是二进制文件,但没和库之类的形成链接无法独立运行。

有权限和有能力不是一回事:目标文件

4,链接(生成可执行文件或库文件)

链接属于最后步骤:生成可执行文件:

二、关于链接

链接在库中就会给我们提供方法

c语言的标准库,本质上就是一个文件,有路径

库有自己的命名风格:libname.so.xxx

在linux中有.so(静态库)\.a(静态库)

在Linux中默认只会安装了动态库,静态库需要自己安装

在编译器使用静态库链接时,会将自己的方法拷贝到目标程序中,之后不再调用静态库链接

指令;dd+文件名(可查看该文件用到的库)

验证:

要使用静态库编译程序,在后面加-static,没有静态库可以用yum安装:

sudo yum install -y glibc-static 

可以看到a.out和test.out大小差距,前者用了动态库,后者用了静态库。

如果我们没有静态库,直接使用是不行的,但是我们有静态库没有动态库,在编译器找不到动态库之后就回去找静态库,-static的本质就是改变优先级。

动静态链接可以混合使用

动静态的优缺点:

动态库优点:属于共享库,有效节省资源(磁盘,内存,网络)空间

动态库缺点:动态库一旦缺失导致整个程序都无法运行

静态库优点:不依赖库程序,可以独立运行

静态库缺点:体积大,比较消耗资源

debug&&release

debug可以被追踪调试:

gcc test.c -o test -g

其中-g就是以debug的形式编译程序

命令:readelf -S test.c -debug

可以把空间布局情况打印:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值