Linux第五讲----gcc与g++,makefile/make

1.代码编译

1.1预处理

我们通过vim编辑完文件之后,想看一下运行结果这时我们便可以试用gcc编译C语言,g++编译c++.

编译代码:

上述两种方法均可,code.c是我的c语言文件,mycode是我给编译后产生的二进制文件起的名(随便起)(-o后面加可执行程序名)

下面我们来了解一下预处理的作用

输入如下内容

 解释:-E表示从现在开始进行程序的编译,当预处理完毕时,翻译工作就会停下来

code.c 文件在经过预处理后会形成一个二进制文件我们起名为code.i 。下面我们打开它看一下! 

由此对比,我们得出结论:预处理进行宏替换,去注释,条件编译,以及头文件展开,而在预处理之后,便没有了注释,也没有了头文件

 1.2 编译

输入如下内容,将code.i进行编译并生成汇编

-s表示 从现在开始进行程序的编译,编译完成就停下来

1.3 汇编

-c 表示 从现在开始进行程序的翻译,汇编完成就停下来

code.o为可重定位目标二进制文件,即重新填写目标函数在库中的地址,该文件机器可以识别,

1.4 链接

 生成可执行文件和库文件

linux中,动态库以.so结尾,静态库以.a结尾

2.库

2.1 动态库和静态库

首先是动态库,在windows中是以.dll为后缀,而在linux中是以.so为后缀,动态库形成动态链接

然后是静态库,在windows中是以.lib为后缀,而在linux中是以.a为后缀,静态库形成静态链接

2.2优缺点比较

动态库:

优点:节省资源

缺点:一旦丢失,所有程序无法直接运行,而且在运行时会稍微慢一点点

静态链接:

优点:不依赖任何库,自己就能独立运行

缺点:体积大,占据资源多(占磁盘空间,内存空间),加载速度受影响

3.make/makefile

3.1基本概念

make是一个Linux系统内置的命令,makefile是一个需要工程师自己建立的一个文件(m大小写都行)

3.2编写代码

我们创建一个makefile文件,并在文件中写入如下内容,注意,gcc前面的空格为TAB键!

 之后我们输入的make命令会自动寻找Makefile,也就是说make会解释makefile的命令并形成可执行程序,在这里叫code

 我们在make之后可以看一下会形成叫code的可执行程序

但是每次编译都会形成code文件清理起来比较麻烦,因此我们在Makefile文件在加一些东西

 

这样,当我们想清理时,直接make clean就行了 

3.3结论

code.c表示目标文件,而code.c和code是有依赖关系的,表示code依赖code.c,只有依赖关系+依赖方法结合在一起我们才能成功的编译

.PHONY:表示被修饰的目标是一个伪目标,而伪目标总是被执行的!

我们先来了解一下什么叫做不被执行

我们尝试输入几次make指令,会得到如下界面

这是因为我们第一次已经编译过这个文件了,再次编译时为了提升效率,便会提示这个,但是如果我们将Makefile改成这样在试试

 因此,可执行程序不要修饰成为PHONY,clean修饰成为总是执行的

而出现上述结果差异的原因我在后文中会讲述!

随后我们再看一下文件的详细信息,输入

得到

其中,Access表示最近被访问的时间(特殊)

modify表示文件内容最近修改时间

change表示文件属性的最近修改时间 

比如我现在将code.c的内容修改一下,

modify变了,但是change也变了,这是因为内容被修改时,他的属性也会变化 

再将权限改一下:

发现change改变了

那么make/makefile是怎么知道需不需要重新编译的呢?

由于源文件本身有一个modify时间,而可执行程序也有一个modify时间,需要对比二者的时间,如果源文件最新就要编,可执行文件最新就不用编,这也就是为什么前文make之后就不能在编译了而改一下源文件后又可以编译的原因

3.4 底层

我们将makefile的代码改一改,这样的

会发现这个依赖关系是一层一层的

3.5 注释 

在makefile中,注释用#,方法同上一篇博文

3.6打印

我们在makefile输入如下内容:

之后可以打印我们的内容

会有两个内容,但有一个是过程,也叫回显,我们不妨加个@关闭回显

这样我们便关闭了回显

3.7定义变量

 验证一下:

所以我们将代码改造一下:

 这样我们便可以按照所需改造代码了

简化:

$@代表$(BIN),$^代表$(SRC) (:右边的所有内容) 

所以最终我们将其写成这个形式

但是倘若我们有很多code.c,一次一次写很麻烦,所以我们改进一下:

wildcard 

 

(目标文件列表) 

这样就不用担心多个文件了

 

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

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

相关文章

知识图谱+智能问诊预诊系统vue+django+neo4j架构、带问诊历史

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站,有好处! 🤍编号:D032 🤍智能问答:智能问答自诊、预诊功能,同时可以保存问答历史 &…

Chromium_src源码

Chromium_src源码 码云上有一个OpenHarmony-TPC/chromium_src项目,目前已经停止维护了,迁移到GitCode上了,源代码项目地址为:openharmony-tpc/chromium_chrome 特此记录一下老的项目的相关软件架构 Chromium 简介 软件架构 软…

深度学习神经网络分类原理

每一个神经元做的是一个类似回归的操作 最后一层是softmax函数,每一个输出就会变成一个0到1之间的数,也就是概率,然后他们之间的和加起来等于1,到底是哪一个分类就是看哪个神经元的这个值最大。 那么如何算损失呢: 加…

编程题 - 汽水瓶【JavaScript/Node.js解法】

‌“学如逆水行舟,不进则退。”‌ ——《增广贤文》 目录 汽水瓶 题目:解答分析:js代码解答 -ACM模式:代码通过:题解分析:简洁思路代码: 汽水瓶 题目: 某商店规定:三个空…

Oracle 数据库基础入门(四):分组与联表查询的深度探索(上)

在 Oracle 数据库的学习进程中,分组查询与联表查询是进阶阶段的重要知识点,它们如同数据库操作的魔法棒,能够从复杂的数据中挖掘出有价值的信息。对于 Java 全栈开发者而言,掌握这些技能不仅有助于高效地处理数据库数据&#xff0…

Mybatis实现批量添加

1.设计一张商品表 CREATE TABLE IF NOT EXISTS goods (id BIGINT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL );2.编写实体类映射数据库表格 Data public class Goods {private Long id;private String name;// Getters and Setters }3.编写持久层接口以及其对应…

FPGA开发时序图绘制

开始的时候画时序图都是拿 visio 硬连,但是那个线宽太难统一了,丑不拉几的,遂学习 waveform 语法使用代码来画时序图。 开始 Vscode 中安装 waveform render 或者在 GitHub 搜索 wavedrom 安装即可。由于 vscode 是我常用的编辑器&#xff…

【Python爬虫】爬取公共交通路网数据

程序来自于Github,以下这篇博客作为完整的学习记录,也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据,并生成shp文件,…

微服务组件详解——sentinel

1.启动sentinel: 下载jar sentinel-dashboard-1.8.0.jar 使用以下命令直接运行 jar 包(JDK 版本必须≥ 1.8): java -Dserver.port9999 -jar D:\sentinel-dashboard-1.8.0.jar 控制台访问地址:http://localhost:9999…

AJAX介绍

XMLHttpRequest get请求使用 const xhr new XMLHttpRequest(); xhr.open("GET", "/data/test.json", true); xhr.onreadystatechange function () {if (xhr.readyState 4) {if (xhr.status 200) {alert(xhr.responseText);} else {console.log("…

Windows下使用docker安装rocketmq

最近准备把rocketmq重新学下,先把环境搭建好 Windows下安装docker拉取最新的rocketmq启动nameserver启动broker 首先在Windows下安装docker,之前不知道为什么,docker desktop启动一直报错,今天把Windows更新了一下,do…

Oracle 11g的部署配置

1、进入官网下载所需版本的Oracle 2、安装 ①:选择setup.exe开始安装 ②:安装提示如下,直接忽略,选是 ③:配置安全更新 填写邮箱,并取消勾选 ④:如果点击下一步,提示什么代理啥的…

【RabbitMQ】RabbitMQ的核心概念与七大工作模式

🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 在现代分布式系统和微服务架构中,消息队列(Message Queue) 是解决服务间通信、系统解耦和流量削峰的关键技术之一。而 RabbitMQ 作为一…

springboot宠物服务系统-计算机毕业设计源码29146

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3 论文结构与章节安排 2 系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体…

使用 CLion 代替 BeyondStudio for NXP 开发 JN 5169

使用 CLion 代替 BeyondStudio for NXP 开发 JN 5169 一、安装 CLion二、搭建 NXP JN5169 ZigBee 3.0 开发环境和下载示例工程三、配置 CLion1、使用 CLion 打开 JN-AN-12192、创建自定义构建目标3、添加构建配置4、在构建前添加外部工具5、添加 6 个运行配置对于 6 个构建选项…

《鸢尾花数学大系:从加减乘除到机器学习》开源资源

《鸢尾花数学大系:从加减乘除到机器学习》开源资源 Gitee:https://gitee.com/higkoo/ bilibili:https://space.bilibili.com/513194466 GitHub:https://github.com/Visualize-ML

操作系统启动——前置知识预备

文章目录 1. 理解冯诺依曼体系结构1.1 简单见一见冯诺依曼1.2 进一步认识1.3 为什么一定要有内存的存在? 2. 操作系统2.1 概念2.2 设计OS的目的2.3 OS的核心功能2.4 如何理解“管理”二字?(小故事版)2.5 系统调用和库函数概念 3. 进程简述3.1 基本概念3.…

PMP项目管理—资源管理篇—5.管理团队

文章目录 基本信息4W1HITTO输入工具与技术输出 冲突管理解决方案八字方针冲突管理策略 基本信息 4W1H what: 跟踪团队成员工作表现,提供反馈,解决问题并管理团队变更,以优化项目绩效的过程。why: 影响团队行为、管理团队冲突,解…

数据结构与算法:选择排序

介绍 选择排序是一种简单直观的排序算法,其基本思想是:从待排序的数据元素中,每次选择最小(或最大)的元素,将其与序列的起始位置交换,然后继续对剩余的元素进行排序,知道整个序列排…

大模型提示词推理架构对比:ReAct/CoT/ToT

人工智能(AI)已不再只是一个流行词——它是驱动现代问题解决的引擎。但AI究竟是如何“思考”的呢?这就涉及到了推理框架。在本文中,我们将探讨三种关键框架:ReAct(推理与行动)、思维链&#xff…