Linux编译器-gcc/g++的使用

在这里插入图片描述
在这里插入图片描述

.

个人主页:晓风飞
专栏:数据结构|Linux|C语言
路漫漫其修远兮,吾将上下而求索



gcc和g++

gcc --> c语言
g++ --> c++或者c语言

用gcc -v查看版本
如果版本过低,用gcc test.c -std = c99让gcc支持c99
在这里插入图片描述
指定可执行程序的名称
gcc 运行的时候默认生成a.out文件,用 -o+文件名可以修改,生成一个自己指定的名字
在这里插入图片描述

c++文件后缀名常见的几种

.cpp
.cc
cxx

使用c++11 的标准想让g++支持更高的语法特性

在这里插入图片描述
指定生成文件名,一样用用 -o
在这里插入图片描述

程序翻译的过程 - 选项
在这里插入图片描述


编译

运行gcc -E Test.c -o Test.i
在这里插入图片描述

gcc -E 表示从现在开始进行程序的翻译,预处理完成就停下

我们将Test.i打开查看,会发现里面多出来了很多东西,
在这里插入图片描述

那么多出来的这么东西从哪里来的呢?多出来的东西,从stdio.h头文件来的
对我们编译代码的时候,程序预处理时,会把头文件相关内容拷贝到源代码,
并且头文件可能也会包含头文件,所以可能会做一个递归程次的拷贝,这个过程我们称之为头文件展开,所以理论上只要经过预处理,头文件也就没有用到了
安装gcc或者g++时,首先会安装c和c++的头文件,而安装的时候,一般会安装到usr/include/目录下
Linux头文件存在于Linux上的usr/include/目录下
输入ls usr/include/可以查看到很多头文件

在这里插入图片描述


条件编译

当我们宏定义v1时运行,会发现只有功能1运行了,这时候我们运行gcc -E Test.c -o Test.i,查看Test.i的时候就会发现代码发生了裁剪,中只有v1部分了
所以很多软件,的社区版或者免费版和收费版只需要唯一一个项目;
在这里插入图片描述
运行结果只有功能1,这时候我们运行gcc -E Test.c -o Test.i,查看Test.i,就会发现只剩下v1部分。
在这里插入图片描述

gcc -D 动态添加宏
在这里插入图片描述

这样就可以很方便的进行代码裁剪了


编译过程

gcc-S从现在开始,进行程序编译,编译完成就停下来
将c语言变成汇编语言
运行gcc -S Test.i -o Test.s
在这里插入图片描述

把汇编文件放在Test.s文件里


汇编

gcc-c从现在开始进行程序的翻译,汇编完成就停下来
汇编语言翻译成为,二进制目标文件
运行gcc -c Test.s -o Test.o
在这里插入图片描述


链接

形成可执行程序

此时我们gcc Test.o,然后就会生成可执行文件,我们把他命名为my.exe
在这里插入图片描述
运行my,exe
在这里插入图片描述
在这里插入图片描述
速记gcc过程-ESc 后缀名iso

链接

链接是什么?
我们的程序和库结合的过程,语言一定要有自己的标准库

查看链接的动态库ldd
在这里插入图片描述

讲解

Linux
动态库:.so
静态库:.a
Linux中库真实的名字:去掉前后缀如:libc.so.6
去掉lib,去掉后缀,就剩下了c,所以意味着c标准库

windows:
动态库:.dll
静态库:.lib

为什么要程序和库结合?

a.让我们开发站在巨人的肩膀上
b.提高开发效率

链接时,两种链接方式

动态库,动态链接的优缺点
1不可以丢失
2.节省资源

静态链接和&静态链接的优缺点

1,一旦形成,和库无关
2.浪费资源

默认情况下,没有安装静态库

输入该指令安装c和c++的静态库

sudo yum install -y glibc-static libstdc++-static

验证

输入
gcc Test.c -o mytest
gcc -o mytest_static Test.c -static
创建两个文件(一个用动态库,一个用静态库)
在这里插入图片描述

分别对两个文件ldd,可以发现一个显示了库,一个不是动态可执行文件
在这里插入图片描述

静态链接的应用场景
不依赖库,可以让程序更好的跨平台

猜你喜欢

转载自blog.csdn.net/2203_75397752/article/details/135840553