Linux开发工具——gcc/g++

在windows下我们有编译器来进行代码的预处理、编译、汇编、链接,那么在Linux下我们如何来运行代码的呢?这就是本篇文章所要记录的知识,在windows下有编译器,在Linux下有开发的工具来运行代码。

目录

gcc/g++

预处理(进行宏替换)

编译(生成汇编)

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

连接(生成可执行文件或者库文件)


gcc/g++

gcc是用来编译运行C语言代码,而g++既可以编译运行C++还可以C语言,因为c++兼容C语言。

那么如何来使用gcc/g++呢?正常情况下我们想要代码运行的最终结果就直接使用gcc/g++带文件名称就可以生成一个可执行文件,./+该可执行文件就可以运行了。而gcc/g++的活就是预处理、编译、汇编、链接生成可执行文件。

示例:

-o选项可以重命名该可执行文件,不加-o生成的可执行文件就是a.out

预处理(进行宏替换)

使用gcc/g++进行代码编译,首先就是预处理这个步骤,预处理阶段需要做哪些事情呢?一般我们写的代码会有宏定义、注释等,而预处理的工作就是对代码进行宏替换,去注释,展开头文件等,通过gcc/g++指令可以观察预处理之后的代码。选项"-E",该选项的作用是让 gcc 在预处理结束后停止编译过程,选项"-o"是指目标文件,".i"文件为已经过预处理的C原始程序。

示例:

gcc -E 这个指令就是告诉gcc,从现在开始程序的翻译工作,将预处理工作做完就停下来,不再继续往下走。

编译(生成汇编)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。用户可以使用"-S"选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

示例:

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

汇编阶段是把编译阶段生成的".s"文件转成目标文件。

读者在此可使用选项"-c"就可看到汇编代码已转化为".o"的二进制目标代码了。

示例:

通过vim来查看test.o文件看到的是一堆乱码。只有机器能看懂。

以上三个指令有记忆的小技巧,和键盘最左上角的Esc是一样的,只不过指令的s需要大写。文件后缀iso。

连接(生成可执行文件或者库文件)

这里就跟函数库有关,在我们写代码时使用一些函数,但是我们并没有实现这个函数却可以使用它,因为系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到

系统默认的搜索路径"/usr/lib"下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函

数"printf"了,而这也就是链接的作用。

库也有自己的命名规则:bliname.so.xxx,默认是动态库

而函数库分为静态和动态库,两者各有各的优缺点。

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为".a",优点:不依赖库,程序可以独立运行。缺点:体积大,比较消耗资源。

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为".so",如前面所述的 libc.so.6 就是动态库。优点:由于是共享库,有效节省资源。缺点:动态库一旦丢失,导致各个程序将不能运行。

gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件。加上"-static"提供静态库。

由于动态库是默认安装的,所以我们需要自己手动(使用root账号安装)安装静态库:

C语言静态库安装:yum install -y glibc-static

示例:

普通用户需要使用sudo提权来安装,提权的前提是该用户在系统的白名单中。

C++静态库安装:yum install -y libstdc++-static

示例:

gcc选项

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面

-S 编译到汇编语言不进行汇编和链接

-c 编译到目标代码

-o 文件输出到 文件

-static 此选项对生成的文件采用静态链接

-g 生成调试信息。GNU 调试器可利用该信息。

-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.

-O0

-O1

-O2

-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

-w 不生成任何警告信息。

-Wall 生成所有警告信息

相关推荐
大树886 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush46 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5207 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz7 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工7 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智8 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩8 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_8 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化