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

Linux笔记--GCC

        GCC编译器是Linux系统下最常用的CIC++编译器,大部分Linux发行版中都会默认安装。GCC编译器通常以gcc指令的形式在终端中使用。

一.gcc指令

1.直接编译

        创建a.c文件

#使用gcc对程序进行编译,默认得到可执行文件的文件名为a.out
gcc [文件名].c
gcc a.c
./a.out

2.分步编译

        -o:重命名.out文件,默认是a.out

#预处理
--对.c程序文件进行预处理得到.i预处理文件
gcc -E[文件名].c -o[文件名].i
gcc -E a.c -o a.i#编译
--通过编译得到.s汇编文件(如果操作对象是.c文件,会进行预处理+编译)
gcc -S [文件名].i
gcc -S a.i#汇编
--通过汇编得到 hello.o机器码文件(如果操作对象是.c文件,会进行预处理+编译+汇编;如果操作对象是.i文件?)
gcc -c[文件名].s
gcc -c a.s#链接
--通过链接得到a.out可执行文件(如果操作对象是.c文件,进行完整编译步骤)
gcc [文件名].o
gcc a.o -o a

二、编译步骤

        从hello.c到hello (或a.out)文件,必须历经hello.i、hello.s、hello.o、hello (或a.out))文件,分别对应着预处理、编译、汇编和链接4个步骤,整个过程如图所示:

  • 预处理:通过预处理器处理头文件展开、宏定义扩展等,生成.i文件,还是C代码;
  • 编译:将预处理得到的源代码文件进行语法词法分析,“翻译转换"产生出机器语言的.s文件,得到机器语言的汇编文件;
  • 汇编:将汇编代码翻译成了机器码,得到.o目标文件,但是还不可以运行;
  • 链接:处理可重定位文件,把各种符号引用和符号定义转换成为可执行文件中的合适信息,通常是虚拟地址。

三、目标文件

        创建a.c文件,a.c中调用外部函数thanks()

#include<stdio.h>void print_thank();int main(int argc,char *argv[])
{print_thank();printf("Hello World!\n");return 0;
}

        创建thank.c包含 ptintf_thank()函数

#include<stdio.h>
void print_thank ( ) ;
{printf("Thank you\n");
}
gcc a.c thank.c
./a.out

        当多文件编译时,如果更新了某个文件的内容,需要将文件都重新编译。只需要重新编译二进制.o文件,再重新生成.out文件

#修改了thank.c文件
gcc -c thank.c
gcc a.o thank.o
./a.out

        目标文件常常按照特定格式来组织,在Linux下,它是ELF格式(Executable LinkableFormat,可执行可链接格式)。

而通常目标文件有三种形式:

  • 可执行目标文件(executable)。即我们通常所认识的,可直接运行的二进制文件。
  • 可重定位目标文件(relocatable)。包含了二进制的代码和数据,可以与其他可重定位目标文件合并,并创建一个可执行目标文件。(.o文件)
  • 共享目标文件(shared object)。它是一种在加载或者运行时进行链接的特殊可重定位目标文件。

相关文章:

  • 全新2.0版本极其抽象的门(Spring Security)
  • Unity RectTransform·屏幕坐标转换
  • 【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug
  • 2024目前三种有效加速国内Github
  • 算法修炼-动态规划之路径问题(1)
  • 代码随想录算法训练营第四十六天 139.单词拆分、多重背包(了解)、 背包总结
  • 类与对象的实践----日期相关函数的实现
  • 【硬件相关】IB网/以太网基础介绍及部署实践
  • cartographer ceres后端优化
  • 13. Springboot集成Protobuf
  • 【Spring连载】使用Spring Data访问 MongoDB----对象映射之对象引用
  • 文心一言 Python编程之
  • 【深度学习笔记】计算机视觉——图像增广
  • 蓝桥杯备战刷题two(自用)
  • Dsco Dropship EDI需求分析
  • co.js - 让异步代码同步化
  • export和import的用法总结
  • IDEA常用插件整理
  • Linux gpio口使用方法
  • MobX
  • React 快速上手 - 07 前端路由 react-router
  • React组件设计模式(一)
  • Vue2.x学习三:事件处理生命周期钩子
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 高度不固定时垂直居中
  • 批量截取pdf文件
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 实现菜单下拉伸展折叠效果demo
  • 系统认识JavaScript正则表达式
  • ionic异常记录
  • kubernetes资源对象--ingress
  • #pragma pack(1)
  • (07)Hive——窗口函数详解
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (pojstep1.3.1)1017(构造法模拟)
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)Java算法:二分查找
  • (转)Sublime Text3配置Lua运行环境
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .NET BackgroundWorker
  • .NET Core 项目指定SDK版本
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET的微型Web框架 Nancy
  • .NET关于 跳过SSL中遇到的问题
  • /usr/bin/env: node: No such file or directory
  • [ACTF2020 新生赛]Upload 1
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [Android] Upload package to device fails #2720
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)
  • [CISCN2019 华东南赛区]Web11