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

【Linux】 GCC/G++与Makefile使用

Linux GCC/G++使用

GCC如何完成

格式:gcc [选项] 要编译的文件 [选项] [目标文件]

常用选项:

  • -E:让gcc在预处理结束后停止编译过程,输出.i的C语言原始文件。
  • -S:该选项只是进行编译而不是进行汇编,最终生成汇编代码的.s文件。
  • -o <filename>:指定输出目标文件名。
  • -c:仅编译,不链接,输出.o二进制目标文件。

程序从源代码到可执行文件,经过预处理、编译、汇编与链接四个步骤:

  1. 预处理:展开头文件、宏替换、条件编译处理,生成经过预处理的.i文件。

示例:

gcc -E hello.c -o hello.i
  1. 编译:语法检查与生成汇编代码,检查无误生成汇编语言的.s文件。

示例:

gcc -S hello.i -o hello.s
  1. 汇编:将编译阶段生成的.s汇编代码转换为机器码,生成.o目标文件。

示例:

gcc -c hello.s -o hello.o
  1. 链接:合并目标文件和库,生成可执行文件(如.out)。

示例:

gcc hello.o -o hello

程序流程图:

	graph LR;![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/2281bed57cab457e98467f0bf078fbcb.jpeg#pic_center)
A[源代码文件 .c] --> B[预处理 .i]B --> C[编译 .s]C --> D[汇编 .o]D --> E[链接 可执行文件]

动态链接与静态链接

动态链接

在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时
链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so

静态链接

静态链接时,程序包含所有依赖库的代码,生成的可执行文件较大,但无需外部库即可独立运行。其后缀名一般为.a

可以使用file命令查看文件是动态链接还是静态链接:

$ file /path/to/your/program
/path/to/your/program: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=0x4a00b217499069528e862542e52e31418370a71b, not stripped

上述输出中的“statically linked”表明该文件是静态链接的。对于动态链接的文件,输出中则会显示“dynamically linked”。

此外可以使用ldd命令查看所使用的库函数:

$ ldd /path/to/your/program
linux-vdso.so.1 =>  (0x00007fffe3ff9000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f93b7d67000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f93b79ab000)
...

libc.so中去掉lib前缀和.so后缀,可以看出它是调用了C语言的标准库。

Makefile 的深入理解与应用

在 Linux 或 Unix 系统中,Makefile 是一种用于自动化构建过程的脚本文件,它告诉 make 程序如何编译和链接源代码来创建可执行文件。Makefile 文件可以命名为 makefileMakefile 或者任何其他名字,但是使用大写的 Makefile 是一个常见的约定。

示例 Makefile

在 Makefile 中,规则是构建过程的核心,它们告诉 make 如何以及何时更新目标文件。规则的基本语法如下:

target: dependenciescommands
  • target:规则的目标,通常是需要构建的文件。
  • dependencies:目标的依赖项,即创建目标所需的文件。
  • commands:一系列 shell 命令,用于构建目标。

以下是一个简单的 Makefile 示例,用于编译 change.c 并生成可执行文件 mycode

mycode: change.cgcc -o mycode change.c
规则解析

在这个示例中,mycode 是一个目标,change.c 是它的依赖项。当 make 运行时,如果 change.cmycode 新或者 mycode 不存在,那么 make 将执行规则中定义的命令来编译 change.c

伪目标 .PHONY

伪目标用于执行非文件相关的任务,如清理或初始化等。由于伪目标并不对应于文件系统中的文件,因此不会受到时间戳的影响,每次都会执行其命令。使用 .PHONY 关键字可以显式地将目标标记为伪目标:

.PHONY: clean
clean:rm -f *.o mycode

这里 clean 目标用于删除所有 .o 文件和 mycode 文件,即使这些文件不存在,make 也会尝试执行这个目标。

Makefile 中的 Tab 字符

在 Makefile 中,命令必须使用 Tab 字符来缩进,而不是空格。这是因为 make 解释器期望 Tab 来标识命令行。

更新文件时间戳

make 会检查目标和依赖项的修改时间戳。如果任何一个依赖项的修改时间比目标晚,或者目标不存在,那么 make 将执行相应的命令来更新目标。

为了触发重新编译,可以使用 touch 命令更新文件的时间戳。例如,如果修改了 change.c 文件的内容,但是时间戳没有改变,可以运行:

touch change.c

这将更新 change.c 的时间戳,使 make 认为文件已经被修改,并触发重新编译。

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android Spinner
  • 数据结构和算法(0-1)----递归
  • ArduPilot开源代码之OpticalFlow_backend
  • arm64架构下源码编译安装kafka —— 筑梦之路
  • 【C++】———— 继承
  • 【Linux网络】IO模型{再识 IO/IO模型/阻塞IO vs 非阻塞IO/同步IO vs 异步IO}
  • LangChain内置函数全解析:深入探索与高效应用
  • iPhone 16 Pro系列将标配潜望镜头:已开始生产,支持5倍变焦
  • druid(德鲁伊)数据线程池连接MySQL数据库
  • 【ElasticSearch】ES 5.6.15 向量插件支持
  • 软件供应链安全:如何防范潜在的攻击?
  • 机器学习筑基篇,Jupyter Notebook 精简指南
  • Docker搭建kafka+zookeeper以及Springboot集成kafka快速入门
  • 暑假自律日记十二
  • 同步与异步:.NET 中的 Task.WaitAll 和 Task.WhenAll
  • [NodeJS] 关于Buffer
  • CSS中外联样式表代表的含义
  • DataBase in Android
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java到底能干嘛?
  • Nacos系列:Nacos的Java SDK使用
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Node项目之评分系统(二)- 数据库设计
  • Python 反序列化安全问题(二)
  • Python学习笔记 字符串拼接
  • vue2.0项目引入element-ui
  • WebSocket使用
  • 初识 webpack
  • 汉诺塔算法
  • 机器学习学习笔记一
  • 记一次和乔布斯合作最难忘的经历
  • 离散点最小(凸)包围边界查找
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 实习面试笔记
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 收藏好这篇,别再只说“数据劫持”了
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 我是如何设计 Upload 上传组件的
  • 学习Vue.js的五个小例子
  • 异常机制详解
  • - 转 Ext2.0 form使用实例
  • 自动记录MySQL慢查询快照脚本
  • (bean配置类的注解开发)学习Spring的第十三天
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)Linux——Linux常用指令
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (五)Python 垃圾回收机制
  • (一一四)第九章编程练习
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一