当前位置: 首页 > ai >正文

gcc和g++

1. 概览:什么是gcc和g++?为什么要用它们?

  • gcc:用来编译C语言(后缀名通常是.c
  • g++:用来编译C++语言(后缀名可以是.cpp.cc.cxx

它们的作用就是把你的源代码(写的程序)变成可以运行的“机器指令”。Linux系统没有像Windows那样的“点后缀名就是C或C++”的规则,但文件后缀名帮助我们识别。


2. 编译过程:从源码到可执行文件的每一步

这里我们把编译过程拆开,讲得细一些,用故事的方式帮助理解。

2.1 你写的代码

你写了一个程序,比如叫做hello.c(用C写的):

#include <stdio.h>int main() {printf("Hello, Linux!\n");return 0;
}

或者C++版本的hello.cpp

#include <iostream>int main() {std::cout << "Hello, Linux!" << std::endl;return 0;
}

2.2 编译前:预处理(Preprocessing)

这一步干什么?

就像帮你整理备用材料一样,预处理会处理所有以#开头的指令,比如宏定义、文件包含、条件编译等。

举个例子:

假设你在代码中写了:

复制代码

#define MESSAGE "Hello"printf("%s\n", MESSAGE);

预处理会把MESSAGE替换成"Hello"

命令:

gcc -E hello.c -o hello.i
  • -E:让gcc只做预处理,不继续后面的步骤
  • -o hello.i:把预处理完的内容存到hello.i文件里

2.3 编译(Compilation)

做什么?

把预处理后代码,变成“汇编语言”。就像是翻译,把人类可以理解的代码变成“基础的指令”。

用命令:

gcc -S hello.i -o hello.s
  • -S:只编译到汇编阶段,不生成目标文件
  • hello.s:存放最终的汇编代码

**简单理解:**这个阶段检查语法,确保没有错误,然后翻译成assembler(汇编代码)。


2.4 汇编(Assembling)

做什么?

把汇编代码转成“机器语言”——0和1组成的目标文件(.o文件),这是给“计算机看”的。

命令:

gcc -c hello.s -o hello.o
  • -c:只做汇编,不后续链接
  • hello.o:输出二进制的目标文件

一般情况下,直接用gcc就会自带这个过程,但这是帮你理解每一环。


2.5 链接(Linking)

做什么?

把所有的目标文件(.o文件)和需要的库(比如libc)“粘在一起”,形成最终的可执行程序。

命令:

复制代码

gcc hello.o -o hello
  • -o hello:指定最终生成的可执行文件名,比如叫hello

**提示:**不是所有时候都需要手动执行每个步骤,通常你只需一条命令:

复制代码

gcc hello.c -o hello

这会自动帮你完成预处理、编译、汇编、连接全部工作。


3. 函数库(Libraries)是啥?

你写printf(),它其实不是你自己写的函数,而是来自一个叫“库(library)”的东西。比如libc库,里面存放了各种标准函数。

  • 静态库.a文件):在编译时把库的内容“打包”到你的程序里,体积大,但不用额外库文件就能运行。
  • 动态库.so文件):在程序运行时“载入”库,只连接一次,节省空间。

默认情况下,gcc会用动态链接.so库)方式,除非你特别要求静态链接。


4. 总结一遍:流程一览

阶段作用常用命令
预处理替换宏定义、文件包含,处理注释 etc.gcc -E source.c 或 -E
编译转成汇编代码gcc -S source.i
汇编转成机器码(目标文件.o文件)gcc -c source.s
链接生成可执行文件或库gcc -o program source.o

5. 用一句话总结:

“用gcc/g++,你把写好的代码(C或C++)交给它,它就会帮你经过预处理、编译、汇编、链接,最终让你的程序可以跑起来。”


6. 简单示例:

直接用一条命令把代码编译成“能跑”的程序:

gcc hello.c -o hello

或者在没有写头文件和参数的情况下,直接写:

gcc hello.c

这会默认把生成的可执行文件叫做a.out

http://www.xdnf.cn/news/5906.html

相关文章:

  • 闭包原理与常见陷阱
  • 装饰器在Python中的作用及在PyTorchMMDetection中的实战应用
  • Python -将MP4文件转为GIF图片
  • MyBatis 批量新增与删除功能完整教程
  • SpringBoot的外部化配置
  • 软件测试(1) 软件测试概述
  • 【Qt开发】信号与槽
  • 【技术追踪】InverseSR:使用潜在扩散模型进行三维脑部 MRI 超分辨率重建(MICCAI-2023)
  • Ansible安装与核心模块实战指南
  • 如何正确地写出单例模式
  • 嵌入式软件--stm32 DAY7 I2C通讯上
  • 码蹄集——分解、数组最大公约数、孪生质数、卡罗尔数、阶乘数
  • PY32系列单片机离线烧录器,可配置选项字节和上机台批量烧录
  • The Deep Learning Compiler: A Comprehensive Survey (深度学习编译器:全面调查)
  • milvus+flask山寨《从零构建向量数据库》第7章case2
  • FPGA图像处理(六)------ 图像腐蚀and图像膨胀
  • 【图像处理基石】遥感图像分析入门
  • stm32f103rct6中使用串口1 DMA通信程序含异常处理
  • 数据验证库pydantic的用法
  • 力扣热题——统计平衡排列的数目
  • 进程间通信分类
  • 数组练习题
  • 采购流程规范化如何实现?日事清流程自动化助力需求、采购、财务高效协作
  • 动态查找滚动容器(通用方案)
  • 故障诊断模型评估——混淆矩阵,如何使样本量一致(上)
  • 深入浅出之STL源码分析8_三个指针
  • PostgreSQL 恢复信息函数
  • Android Exoplayer多路不同时长音视频混合播放
  • window 显示驱动开发-报告图形内存(一)
  • ElasticSeach快速上手笔记-入门篇