————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
可以把空间布局情况打印: