Linux——编译器-gcc/g++

gcc/g++是一个编译器

在代码写好后就可以直接用gcc编译程序

但是文件名只能是a.out,并不能改名

这里就要了解一下gcc -o指令

这里的 -o指令永远都是我们要执行可执行程序的名称

但是还是一次性将预处理编译汇编链接都完成了,并不能看到具体的细节

程序全过程详解

1、预处理

头文件展开,条件编译,宏替换,去注释等

-E 从西安开始进行程序的翻译,预处理,做完就停下来

这里的.i后缀的文件就是使用-E选项后形成的文件

没想到竟然有800多行!

但是原来的代码只有十几行

其实多出来的800多行就是把包的<stdio.h>头文件拷贝到了文件中

而且还能看见原先有注释的地方现在都没有了,这个就是去注释 ,还有就是文件里的MAX被替换了,这个就是宏替换,最后就是原来的条件语句if没有了else选项,这时因为既然满足了if条件,就不会再保留else了

2、编译

(C语言汇编语言)

-S,从现在开始进行程序的翻译,当编译做完,就停下来

然后发现原来的800多行代码就变成了有效的60多行代码,这种风格的代码称之为汇编语言

3、汇编

(汇编->可重定位目标二进制文件,不可被执行,bin.obj)------只把我们自己的代码进行翻译成二进制目标文件

-c:从现在开始进行程序的翻译,当汇编做完就停下来

打开后发现都是乱码

4、链接

将我们仔细形成的.obj文件和库文件某种合并,形成可执行程序

最后到链接就是编译器与对应的库进行链接,由于编译器比较智能,能识别我们写出的代码,所以什么指令都不用加,直接gcc就行,就会默认生成a.out文件

哎呀,忘了加换行了。。。

再来学一个新的指令,ldd

ldd后面就可以跟可执行程序,这个指令就可以检测可执行程序形成的时候都依赖了哪些库

我们为什么能在Linux下进行C,C++语言的编译呢?

因为Linux系统已经默认携带了语言级别的头文件和语言对应的库!

看一下include目录下的内容,发现好些都是用过的库

相关推荐
酉鬼女又兒17 小时前
零基础入门计算机网络:网络层核心任务、三大关键问题、两种服务类型与 TCP/IP 网际层协议体系全解析
服务器·网络·网络协议·tcp/ip·计算机网络·php·求职招聘
kong@react17 小时前
Rocky Linux 10.2 全面解析:企业级 CentOS 替代方案及保姆级docker安装
java·linux·运维·docker
Gauss松鼠会17 小时前
【GaussDB】GaussDB重要通信参数汇总
服务器·网络·数据库·sql·性能优化·gaussdb·经验总结
凡人叶枫17 小时前
Effective C++ 条款07:为多态基类声明 virtual 析构函数
linux·c语言·开发语言·c++
睡不醒男孩03082318 小时前
第八篇:如何构建一站式 PostgreSQL 性能优化与智能管控平台?从盲目排查到 CLup 自动化运维演进
运维·postgresql·性能优化
凡人叶枫18 小时前
Effective C++ 条款10:令 operator= 返回一个 reference to *this
java·linux·服务器·开发语言·c++·effective c++
某林21218 小时前
Isaac Sim 5.1.0 无头服务器部署与 RTX 显存段错误排障全记录
运维·服务器·docker·容器·isaac
|_⊙18 小时前
Linux 中断
linux
m0_7381207218 小时前
Docker 环境下 Vulfocus 靶场搭建全流程(附镜像源问题解决方案)
运维·服务器·网络·安全·docker·容器
Gauss松鼠会18 小时前
【GaussDB】GaussDB SMP特性调优详解
java·服务器·前端·数据库·sql·算法·gaussdb