【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 认为文件已经被修改,并触发重新编译。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣144题:二叉树的先序遍历

给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root [1] 输出&am…

C++入门学习——初始化列表

概念 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括 号中的初始值或表达式 class Date { public://初始化列表Date(int year,int month,int day):_year(year),_month(month),_d…

[Windows] 油.管视频下载神器 Gihosoft TubeGet Pro v9.3.88

描述 对于经常在互联网上进行操作的学生&#xff0c;白领等&#xff01; 一款好用的软件总是能得心应手&#xff0c;事半功倍。 今天给大家带了一款高科技软件 管视频下载神器 无需额外付费&#xff0c;永久免费&#xff01; 亲测可运行&#xff01;&#xff01; 内容 目前主…

高德地图显示圆形区域并在区域边上标注半径

bug&#xff1a;循环创建三个圆形区域 &#xff0c;数组设置为[{raduis:500,color:“#FF0000”}]&#xff0c;然后循环取颜色会莫名其妙报错修改为 strokeColor: [“#FF0000”, “#1EE3C2”, “#3772E9”][i]即可 initAMap() {AMapLoader.load({key: "130cca3be68a2ff0fd5…

记VMware网络适配器里的自定义特定虚拟网络一直加载问题解决办法

1、问题描述 VMware网络适配器里的自定义特定虚拟网络一直加载问题&#xff1a; 在自定义&#xff1a;特定虚拟网络选择的时候 没有上图所示的三个选择&#xff0c;而是正在加载虚拟网络.... 如下图所示&#xff1a; 2、解决办法 2.1、原因分析&#xff1a; 是安装时候出现…

安防视频监控/视频汇聚EasyCVR平台浏览器http可以播放,https不能播放,如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

7.15洛谷蓝题

二分答案的两个模板&#xff1a; 1.最小值的最大化&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<bits/stdc.h> #include<iostream> #include<algorithm> #include<cstring> #include<vector> #include<queue> #include<…

Studying-代码随想录训练营day40| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

第40天&#xff0c;动态规划part07&#xff0c;动态规划经典题型“打家劫舍”(ง •_•)ง&#xff0c;编程语言&#xff1a;C 目录 198.打家劫舍 213.打家劫舍II 337.打家劫舍III 总结 198.打家劫舍 文档讲解&#xff1a;代码随想录打家劫舍 视频讲解&#xff1a;手…

【C++进阶学习】第七弹——AVL树——树形结构存储数据的经典模块

二叉搜索树&#xff1a;【C进阶学习】第五弹——二叉搜索树——二叉树进阶及set和map的铺垫-CSDN博客 目录 一、AVL树的概念 二、AVL树的原理与实现 AVL树的节点 AVL树的插入 AVL树的旋转 AVL树的打印 AVL树的检查 三、实现AVL树的完整代码 四、总结 前言&#xff1a…

JavaScript青少年简明教程:输入输出

JavaScript青少年简明教程&#xff1a;输入输出 JavaScript的输入输出情况相对复杂&#xff0c;因为它依赖于其运行的宿主环境&#xff08;如Web浏览器或Node.js&#xff09;来提供具体的输入输出机制。JavaScript的核心规范&#xff08;ECMAScript&#xff09;本身并不直接提…

C基础day9

一、思维导图 二、课后练习 1> 使用递归实现 求 n 的 k 次方 #include<myhead.h>int Pow(int n,int k) {if(k 0 ) //递归出口{return 1;}else{return n*Pow(n,k-1); //递归主体} }int main(int argc, const char *argv[]) {int n0,k0;printf("请输入n和k:&…

韩国coupang上线的卖家官网是什么?韩国电商有哪些平台?

根据Statista的调查报告&#xff0c;预计2024年电子商务市场收入将达到4.117亿美元。而韩国的电子商务市场是全球最具活力和创新性的市场之一&#xff0c;有数据显示2023年韩国电商市场规模已突破1700亿美元&#xff0c;全球排名第四。 韩国coupang上线的卖家官网是什么&#x…

Linux虚拟机扩展磁盘空间

文章目录 在VM上进行扩展新的磁盘空间进入虚拟机将扩展的磁盘空间分配给对应的分区 VM 下的Linux虚拟机提示磁盘空间不足&#xff0c;需要对其进行磁盘扩容&#xff0c;主要有以下两步&#xff1a; 在VM上进行扩展新的磁盘空间 先关闭虚拟机在VM的虚拟机设置处进行硬盘扩展 …

Redislnsight-v2远程连接redis

redis安装内容添加&#xff1a; Linux 下使用Docker安装redis-CSDN博客 点击添加 添加ip地址&#xff0c;密码&#xff0c;端口号 创建完成 点击查看内容&#xff1a;

Redis的单线程讲解与指令学习

目录 一.Redis的命令 二.数据类型 三.Redis的key的过期策略如何实现&#xff1f; 四.Redis为什么是单线程的 五.String有关的命令 Redis的学习专栏&#xff1a;http://t.csdnimg.cn/a8cvV 一.Redis的命令 两个基本命令 在Redis当中&#xff0c;有两个基本命令&#xff1…

记录些MySQL题集(3)

MySQL 分区技术深入解析 分区的基本概念 MySQL分区 是一种数据库优化的技术&#xff0c;它允许将一个大的表、索引或其子集分割成多个较小的、更易于管理的片段&#xff0c;这些片段称为“分区”。每个分区都可以独立于其他分区进行存储、备份、索引和其他操作。这种技术主要…

Docker初识及使用研究

公司使用docker&#xff0c;小组成员人人都是默默使用&#xff0c;也没讲解培训&#xff0c;真是搞笑。 记录自己独自研究及使用&#xff1a; 1)自己安装->失败-系统弄崩->安装成功 目录 1. Docker安装-初次安装失败2. Docker安装-初次安装成功 1. Docker安装-初次安装失…

微信小程序密码 显示隐藏 真机兼容问题

之前使用type来控制&#xff0c;发现不行&#xff0c;修改为password属性即可 <van-fieldright-icon"{{passwordType password? closed-eye:eye-o}}"model:value"{{ password }}"password"{{passwordType password ? true: false}}"borde…

PostgreSQL 中如何解决因长事务阻塞导致的其他事务等待问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因长事务阻塞导致的其他事务等待问题&#xff1f;一、了解长事务阻塞的原因&…

结合实体类型信息(2)——基于本体的知识图谱补全深度学习方法

1 引言 1.1 问题 目前KGC和KGE提案的两个主要缺点是:(1)它们没有利用本体信息;(二)对训练时未见的事实和新鲜事物不能预测的。 1.2 解决方案 一种新的知识图嵌入初始化方法。 1.3 结合的信息 知识库中的实体向量表示&#xff0b;编码后的本体信息——>增强 KGC 2基…