gcc/g++、动静态库、make/makefile
目录
gcc/g++
gcc和g++的对比
"一段代码的使命"
●预处理
●编译
●汇编
●链接
●动/静态链接
make/makefile
gcc/g++
gcc和g++的对比
对于c文件而言,使用gcc或者g++并没有什么区别。而对于cpp文件,在预处理、编译、汇编这三部分,gcc和g++也是等价的。但是在链接阶段涉及c++的标准库时,gcc无法链接到这些库,必须加上-lstdc++ 选项。为了加深理解,测试一下:
先使用gcc编译一下:gcc zz.cpp -o zz
gcc无法链接到c++标准库,指令加上-lstdc++:
删除zz,使用g++在重新编译一下:g++默认以c++的方式进行编译(也可以编译c文件),链接的时候加上了一些c++的库。
了解了gcc/g++后,先来复习下翻译的几个阶段,将下图的过程在linux环境下分步研究:
测试代码:
1 #include <stdio.h>2 #define MAX 103 int main()4 {5 printf("Hello World!");6 //printf("Hi zxy!");7 //rprintf("How are you!");8 #ifdef MIN9 printf("Hello MIN");10 #else11 printf("Hello default");12 #endif13 printf("MAX = %d\n",MAX); 14 return 0;15 }
"一段代码的使命"
●预处理
gcc –E mycode.c –o mycode.i
选项“-E”的作用是让 gcc 在预处理结束后停止编译过程,选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
如上图所示,".i"文件删除了注释,完成了宏的替换,头文件的包含,进行了条件编译,#ifdef判断MIN是否被定义,结果是否定的。
●编译
gcc –S mycode.i –o mycode.s
使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。gcc在把代码翻译成汇编语言之前,还要检查代码的规范性,是否有语法错误等等。
●汇编
gcc –c mycode.s –o mycode.o
汇编阶段是把编译生成的“.s”文件转成目标文件,使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码。
●链接
gcc mycode.o -o mycode
链接的过程将自己写的代码和标准库中的代码合在一起,形成了可执行程序。
./mycode
●动/静态链接
file命令可以查看链接类型例如:file zz
动态链接链接的是动态库,在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”。
动态链接可以这样理解:假设你生活在象牙山村,村里只有一个大脚超市,赵四家需要用什么商品就从家走到超市去买。
静态链接链接的是静态库,编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”。
静态链接可以这样想象,刘能号称象牙山的小诸葛,日常生活用品每周都要去逛一次超市,它觉得很麻烦,在超市进货的时候他向自己家也进了货放在家里。
静态链接不受库升级和库删除的影响,因为已经拷贝了一份。但是占用了很大的空间。
make/makefile
首先要了解到make是一个命令,makefile是一个文件。make和makefile搭配使用可以完成项目的自动化构建,当我们输入make命令,make会在当前目录下找名字为Makefile或者makefile的文件,而在makefile文件中可以定义一系列的规则来指定目录中的哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。也就是说makefile写好后配合make命令使用,输入命令后直接自动化编译,非常的便捷!
上图所示,是正常编译的大致过程,接下来试着将上述编译规则写入makefile文件中使用make自动化编译:
这里需要注意一下文件名称一定要是makefile或者Makefile,否则make是找不到的,依赖方法的定义一定要以Tab键开头:
当然上述的演示非常简单,主要是熟悉下make和makefile。在实际的项目中可能会有不计其数的源文件,这种情况下就可以在makefile中定义一系列的依赖关系和依赖方法。在上述的案例演示中zhang的生成是依赖于zhang.c的,这就是依赖关系。而gcc zhang.c -o zhang这个动作就是依赖方法。
●项目清理
为了方便工程清理,在makefile中定义一个clean,但是clean没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行。需要用“make clean”来执行,以此来清除所有的目标文件,以便重编译。
●伪目标
.PHONY的作用是设置伪目标,伪目标的特性是总被执行,验证伪目标:
观察上图发现,zhang生成后,在zhang.c不被修改的情况下,再次执行make不会再次执行,会告诉我们zhang已经是最新的,这其中的原理稍后在谈论。下面修改makefile文件,.PHONY修饰zhang,进行测试,与未修饰前相比,每次都会执行。
●原理
首先介绍一下stat命令,它可以显示文件的状态信息:
这里重点关注该文件的三个时间:
Access:最后一次访问文件的时间。Modify:最后一次修改文件的时间。Change:最后一次改变文件属性的时间。
当第一次通过zhang.c生成zhang后,前者的修改时间一定是早于后者的:
当对zhang.c文件进行改动后,zhang的文件修改时间会早于zhang.c,这也说明zhang已经不是最新的,所以会再次执行。
●多文件练习make/makefile使用
上述过程,在代码的编写上和以往的练习并没有太大的差别,但是通多对makefile文件的编写使得该工程可以使用make"一件编译",极大的提高了开发效率。
相关文章:

gcc/g++、动静态库、make/makefile
目录 gcc/g gcc和g的对比 "一段代码的使命" ●预处理 ●编译 ●汇编 ●链接 ●动/静态链接 make/makefile gcc/g gcc和g的对比 对于c文件而言,使用gcc或者g并没有什么区别。而对于cpp文件,在预处理、编译、汇编这三部分,…...
北京博奥智源,浅谈图书馆的馆情展示系统细则
功能特点: 1、支持智慧大屏的定制,内置精美的主题模板。 2、提供丰富的数据模块,可通过拖拽自由组合,配置灵活。 3、支持屏幕分辨率自定义,自适应屏幕大小。 4、支持背景颜色的更换,同时可上传图片更换背景…...

Docker----------day-mysql8主从复制
1.安装master 1.1拉取镜像 docker search mysql docker pull mysql mkdir -p /home/mysql8/data mkdir -p /home/mysql8/conf mkdir -p /home/mysql8/log1.2 2.启动交互式添加容器数据卷 #不添加容器数据卷 docker run -p 3307:3306 --name mysql_master -e MYSQL_ROOT_PASS…...

【Nginx】【一】Nginx简介
Nginx简介 背景介绍 Nginx(“engine x”)一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个【POP3/SMTP/IMAP代理服务器】,是由伊戈尔赛索耶夫(俄罗斯人)使用C语言编写的,Nginx的第一个版本是200…...

跳跃游戏II-力扣45-java 动态规划
一、题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - …...
【算法】用python代码解决“鬼谷问徒”问题
文章目录题目相关链接算法代码代码可优化的点喜欢这种搞逻辑的题目。据说chatGPT暂时还不会写hhh。水平有限,我自己花了两个小时才实现,不过解决问题的过程还是很快乐的。题目 一天,鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了…...

【1】linux命令每日分享——mkdir创建目录
大家好,这里是sdust-vrlab,Linux是一种免费使用和自由传播的类UNIX操作系统,Linux的基本思想有两点:一切都是文件;每个文件都有确定的用途;linux涉及到IT行业的方方面面,在我们日常的学习中&…...
TPM 2.0实例探索1
1. 获取用户名 命令及结果如下所示: $ whoami ph2. 获取设备序列号(串号) 命令及结果如下所示: $ sudo dmidecode | grep "Serial Number" | head -n 1Serial Number: MP260S483. 将用户名和设备序列号放入到一个文…...

buu [BJDCTF2020]signin 1
题目描述: 题目分析: 打开发现是16 进制数(我也不知道我是怎么发现的,先是尝试了md5和rot-n,发现都不行,然后参考大佬的才知道是16进制)使用 在线16进制转字符串 便能得到 flag但我如果不想用线上工具&…...

Storage
WebStorage主要提供了一种机制,可以让浏览器提供一种比cookie更直观的key、value存储方式: localStorage:本地存储,提供的是一种永久性的存储方法,在关闭掉网页重新打开时,存储的内容依然保留;…...

CAS底层原理及ABA问题
一、案例CAS是Java中Unsafe类里面的一个方法,它的全称是叫CompareAndSwap比较并交换的一个意思,它的主要功能是能够去保证在多线程的环境下对于共享变量修改的一个原子性。例如,比如说像这样一个场景,有一个成员变量state…...
华为OD机试真题Python实现【单词反转】真题+解题思路+代码(20222023)
题目 输入一个英文文章片段, 翻转指定区域的单词顺序, 标点符号和普通字母一样处理, 例如输入字符串 I am a developer. [0,3] 则输出 developer. a am I 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试(Python)真题目录汇总 输入 使用换行隔开 3 个参数 第一…...

嵌入式linux驱动学习-用cdev代替register_chrdev()
上回说到字符设备驱动程序的注册与销毁register_chrdev()和unregister_chrdev()这是有缺陷的。 嵌入式lnux驱动学习-2.一个驱动程序的流程 现在用另外一个更好的方法代替,我们先来看看register_chrdev()实际上是调用了 __register_chrdev(major, 0, 256, name,…...
技术更新!10个MySQL性能调优技巧
MySQL是世界上使用最广泛的开源数据库,它在业界的受欢迎程度让其他数据库望尘莫及。它是一个关系型数据库管理系统,多年来依然是应用程序的核心。在过去几年里,MySQL有一些重要发展。因此,整理更新10个MySQL性能调优技巧。 模式设…...

ICLR 2023|VLDet:从图像-文本对中学习区域-词语对齐的开放词汇式目标检测
原文链接:https://www.techbeat.net/article-info?id4614&isPreview1 作者:林闯 目标检测任务在AI工业界具有非常广泛的应用,但由于数据获取和标注的昂贵,检测的目标一直被限制在预先设定好的有限类别上。而在学术界…...

如何效率搭建企业流程系统?试试低代码平台吧
编者按:本文介绍了一款可私有化部署的低代码平台,可用于搭建团队流程管理体系,并详细介绍了该平台可实现的流程管理功能。关键词:可视化设计,集成能力,流程审批,流程调试天翎是国内最早从事快速开发平台研发…...

嵌入式开发:C++在深度嵌入式系统中的应用
深度嵌入式系统通常在C语言中实现。为什么会这样?这样的系统是否也能从C中获益?嵌入式开发人员在将广泛、高效的深度嵌入式代码库从C转换为C方面的实践经验的贡献。嵌入式和深度嵌入式系统通常用C而不是C实现。软件开发人员必须放弃C作为强类型系统、模板元编程(TMP)和面向对…...

快鲸scrm发布快递行业私域运营解决方案
现如今,快递行业竞争格局日益激烈,前有“四通一达”等传统快递企业,后有自带互联网基因、绑定电商流量新贵快递企业,如菜鸟、京东等。在这一背景下,很多快递企业开启了增长破局之旅,他们纷纷搭建起私域运营…...
【蓝桥杯集训·每日一题】AcWing 1497. 树的遍历
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴递归一、题目 1、原题链接 1497. 树的遍历 2、题目描述 一个二叉树,树中每个节点的权值互不相同。 现在给出它的后序遍历和中序遍历,请你输出它的 …...

详解matplotlib的color配置
详解matplotlib的color配置 Matplotlib可识别的color格式 格式举例RGB或RGBA,由[0, 1]之间的浮点数组成的元组,分别代表红色、绿色、蓝色和透明度(0.1, 0.2, 0.5), (0.1, 0.2, 0.5, 0.3不区分大小写的十六进制RGB或RGBA字符串。‘#0f0f0f’, ‘#0f0f0f…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...