news 2026/4/26 18:23:19

【Linux】开发工具3 : gcc/g++的使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux】开发工具3 : gcc/g++的使用

其他篇章 【C语言专栏】

其他篇章【Linux专栏】

上期回顾 【Linux】开发工具2:vim

文章目录

  • 前言
  • 1. gcc/g++的使用
    • 1.1 预处理(进行宏替换)
    • 1.2 编译(生成汇编)
    • 1.3 汇编(生成机器可识别代码)
    • 1.4 链接(生成可执行文件或库文件)
    • 1.5 gcc 可以一步生成一个执行程序(将四个步骤合并)

前言

在使用一门编辑语言的时候,我们都必须安装相应的开发包(即头文件和库文件)

  • 头文件:函数的声明
  • 库文件:函数的实现

查看头文件:ls /usr/include/

1. gcc/g++的使用

  • gcc:编译C语言
  • g++:编译 C/C++

生成可执行文件:预处理、编译、汇编、链接

1.1 预处理(进行宏替换)

主要处理以# 开头的指令,核心任务有:

  • 宏替换:把所有 #define 定义的宏(包括函数宏、常量宏),直接替换成对应的文本。
  • 去注释:注释不参与编译,去掉可以减少文件大小
  • 条件编译:#ifdef / #ifndef / #if / #else / #endif 等指令,只保留满足条件的代码段,删除不满足的分支。
  • 头文件展开:把 #include <xxx.h> / #include “xxx.h” 对应的头文件内容,完整复制到当前文件中。

命令:gcc -E test.c -o test.i

  • 选项“-E”,该选项的作⽤是让 gcc 在预处理结束后停⽌编译过程。
  • 选项“-o”是指⽬标⽂件,“.i”⽂件为已经过预处理的C原始程序。

!!!注意区分:

命令作用生成的文件类型能否直接运行
gcc -E test.c -o test.i只做预处理C源码文件 ( .i )不能
gcc test.c -o test完整编译+链接可执行程序可以

示例:


结果:

解析:

  1. #define DEBUG 1 :定义了一个名为 DEBUG 的宏,值为1。

  2. #ifdef DEBUG :预处理指令,意思是“如果 DEBUG 这个宏被定义了,就执行下面的代码”。

  3. 因为 DEBUG 已经被定义了,所以预处理时会保留 printf(“Debug mode\n”);

  4. 这行代码,程序运行时会打印 Debug mode 。

1.2 编译(生成汇编)

  • 在这个阶段中,gcc ⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,gcc 把代码翻译成汇编语⾔。
  • -S:(仅执行编译,停止后续流程)
  • .s:输出的汇编文件(test.s)

命令:gcc –S test.i –o test.s

[qianyv@VM-0-9-centos~]$ gcc-S test.c-o test.s[qianyv@VM-0-9-centos~]$ ll total28-rw-rw-r--1qianyv qianyv135Apr2614:19test.c-rw-rw-r--1qianyv qianyv16878Apr2614:11test.i-rw-rw-r--1qianyv qianyv446Apr2615:00test.s-rw-r--r--1root root0Apr1922:08test.txt

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

汇编阶段是把编译阶段⽣成的“.s”⽂件转成⽬标⽂件

  • -c:仅执行汇编,生成目标文件
  • .o:输出的目标文件(test.o)—二进制格式,不能执行

命令:gcc –c test.s –o test.o

[qianyv@VM-0-9-centos~]$ gcc-c test.s-o test.o[qianyv@VM-0-9-centos~]$ ll total32-rw-rw-r--1qianyv qianyv135Apr2614:19test.c-rw-rw-r--1qianyv qianyv16878Apr2614:11test.i-rw-rw-r--1qianyv qianyv1496Apr2615:03test.o-rw-rw-r--1qianyv qianyv446Apr2615:00test.s-rw-r--r--1root root0Apr1922:08test.txt

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

将目标文件(.o)和库进行链接,就得到了可执行程序

  • -o:用来指定可执行程序的名称(这里我写了是test),不写的话默认是 a.out

gcc test.o -o test

[qianyv@VM-0-9-centos~]$ gcc test.o-o test[qianyv@VM-0-9-centos~]$ ll total44-rwxrwxr-x1qianyv qianyv8360Apr2615:08test-rw-rw-r--1qianyv qianyv135Apr2614:19test.c-rw-rw-r--1qianyv qianyv16878Apr2614:11test.i-rw-rw-r--1qianyv qianyv1496Apr2615:03test.o-rw-rw-r--1qianyv qianyv446Apr2615:00test.s-rw-r--r--1root root0Apr1922:08test.txt

1.5 gcc 可以一步生成一个执行程序(将四个步骤合并)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 18:12:45

上市公司-工业机器人渗透度(2008-2022年)

01、数据简介IFR&#xff0c;即国际机器人联合会&#xff08;International Federation of Robotics&#xff09;&#xff0c;是一个致力于机器人技术和自动化领域发展的全球性组织。该组织每年对全球机器人制造商进行调查&#xff0c;通过收集机器人制造商提供的一手数据&…

作者头像 李华
网站建设 2026/4/26 18:12:40

用CircuitPython做个LOL人机脚本:从硬件选型到代码调试的完整避坑指南

用CircuitPython打造游戏自动化脚本&#xff1a;从硬件搭建到智能调参实战 坐在电脑前重复点击鼠标执行相同操作的时代该结束了。去年我用CircuitPython给工作室开发了一套自动化测试工具&#xff0c;意外发现这套方案在游戏自动化领域有着惊人的潜力——尤其适合需要规律性操作…

作者头像 李华
网站建设 2026/4/26 18:12:39

大数据的“存储”:你的数据,到底住在哪儿?

前言&#xff1a;从你床头柜上那张手写便签说起在上一篇文章里&#xff0c;我们聊了数据是怎么被采集的。你知道了&#xff0c;你手机里住着一个隐形的“记录员”&#xff0c;你每一次点击、每一次滑动、每一次停留&#xff0c;都被它默默地记下来&#xff0c;打包发走了。那么…

作者头像 李华