【Linux基础开发工具】gcc/g++使用make/Makefile
目录
前言
gcc/g++的使用
1. 语言的发展
1.1 语言和编译器自举的过程
1.2 程序翻译的过程:
2. 动静态库的理解
Linux项目自动化构建工具-make/makefile
1. 快速上手使用
2. makefile/make执行顺序的理解
前言
了解完vim编辑器的使用,接下来就可以尝试写一写代码啦,本期我将会向大家介绍Linux环境下,gcc/g++的使用方法,以及一些使用技巧。

gcc/g++的使用
在此之前我们需要先了解一下语言的发展,以便于我们更好的理解程序编译的过程。
1. 语言的发展
编程语言的发展历程:
- 二进制
- 汇编
- C语言诞生
- C++、python、Java …
1.1 语言和编译器自举的过程
二进制 ——>用二进制写汇编编译器,然后就可以通过汇编语言,编写汇编语言的编译器,使用汇编语言编写C语言编译器,再用C语言编写C语言的编译器……不断向后迭代
1.2 程序翻译的过程:
预处理:
-
头文件展开
-
去注释
-
宏替换
-
条件编译
gcc -E code.c -o code.i从现在开始进行程序的翻译过程,当预处理做完的时候,就停下来
-E预处理
-o 生成指定临时文件(.i文件)
gcc code.c -o code.exe -D N=1-D 指定值
Linux环境下,我们可以给编译器不同的宏值,来进行对代码的裁减
编译:
-
C语言转换为汇编语言
gcc -S code.i -o code.s从现在开始进行程序的翻译,当编译做完的时候,就停下来
汇编:
-
汇编语言翻译成二进制(可重定位目标二进制文件)
gcc -c code.s -o code.o-c汇编做完就停下来
链接:
生成.o文件以后并不能执行(即使有可执行权限)

gcc -o code code.o
-o 指定生成的文件
2. 动静态库的理解
查看文件链接的库:
ldd + [可执行文件]

libc-2.17.so
也就是C标准库
库分为两类:
| 平台 | Linux | Windows |
| 动态库 | .so | .dll |
| 静态库 | .a | .lib |
平台要支持开发,就必须提前在系统中安装 语言的标准头文件+库文件
动静态库本质就是文件
动态库:在程序运行时被加载到内存中,程序可以共享同一个库文件
优点:比较节省资源,不会出现太多重复代码
缺点:对库的以来较强,一旦库文件丢失,使用该库的程序都无法运行
静态库:将自己需要的代码拷贝到自己的可执行程序中,程序运行时不需要额外的库文件(导致可执行文件较大)
优点:不依赖库,同类型平台中都可以直接运行使用
缺点:可执行程序体积比较大,比较浪费资源
使用静态库编译代码:
gcc -o [指定文件名] code.c -static
查看Linux系统中是否有静态库:
ls /lib64/libc.a

显示没有文件就没有安装(一般情况下,系统默认都不会安装)
Centos 7 yum 安装静态库 指令:
sudo yum install -y glibc-static libstdc++-static
安装成功之后可以再次使用上述指令进行验证
Linux项目自动化构建工具-make/makefile
- make 是一个命令
- makefile 是一个文件
makefile文件保存的是依赖关系和依赖方法
1. 快速上手使用
-
编写一个code.c文件
-
手动创建一个名为Makefile的文件(文件名必须是Makefile)
打开文件输入进行写入:

执行make指令就可以自动将代码进行编译
![]()

什么是依赖关系和依赖方法

举个例子:
我们与父母,我们和父母之间就是依赖关系,没有生活费时,我们找父母要生活费,打电话给父母确认依赖关系,向父母要生活费就是具体的依赖方法。
依赖关系:为什么帮你?
依赖方法:怎么帮?
语法:

当我们不修改项目的代码时多次执行make就会出现这种情况:

清理掉项目生成的可执行文件即可,可以对一个项目编译,那我们也要对一个项目进行清除,如何清除?
只需在第一个目标文件下边重新添加一个:
依赖方法:删除文件

使用:
make + 目标文件
![]()
那为什么mybin就可以不指明目标文件?
-
Makefile和make形成文件的时候,默认是从上到下扫描makefile文件,默认形成第一个目标文件
在重复执行的时候,会显示当前的目标文件已经是最新的,那make和makefile是如何知道可执行程序是比较新的呢?
这个其实是通过对比时间比起来的,只要可执行程序的最近修改时间比所有源文件的最近修改时间新,说明它就是最新的!
stat指令可以查看文件的相关时间

其中:
- Modify是修改文件内容的时间
- Change是文件属性改变的时间
它们有什么不同?
文件 = 内容 + 属性
- Modify对应的是文件内容修改
- Change对应的是文件属性修改
但是在修改文件的内容时,我们会发现Change也会发生改变,这是因为我们在修改文件内容时,文件的大小(文件属性)也会发生改变。
Access:在访问一定次数时才会进行更新(为了提高工作效率),在日常操作中,会大量的访问文件,访问频次远超于Modify和Change
知识补充:
touch命令还可以对文件acm(是Access、Change、Modify缩写)的时间进行刷新,不存在的文件它会进行创建
为了解决多次执行时不进行操作的问题,可以使用.PHONY:修饰

# .PHONY:修饰mybin目标文件,成为一个伪目标,总是被执行
注意:.PHONY一般都是修饰clean操作的
这样就可以连续重复的执行
这个机制是Linux中为了防止同个程序被反复编译。
例如:在日常工作中,一个项目有很多代码,makefile文件中存放了许多程序的编译指令,编译一次可能就要二十多分钟,如果哪个模块出了问题进行了修改,调试效果时,如果都重新编译,就要编译二十多分钟,所以为了提高效率,在Linux中,只有被修改后才可以重新编译并且只会对修改的部分进行重新编译、链接。
2. makefile/make执行顺序的理解
它的执行过程也是一个类似递归的过程(先进后出),先进入执行,直到找到最终的文件,然后开始逆向执行

make/makefile的用法还有很多,这里就不再进行深入介绍,本文只是对make/makefile一些基本常见的内容进行介绍
总结
本文介绍的gcc/g++以及make/makefile都是在日常工作中常用的工具,make和makefile用于自动化构建过程,特别是在大型项目中。熟悉和掌握这些工具的基本用法对于软件开发人员来说也是非常重要的,以上便是本文的全部内容,最后感谢阅读!
相关文章:
【Linux基础开发工具】gcc/g++使用make/Makefile
目录 前言 gcc/g的使用 1. 语言的发展 1.1 语言和编译器自举的过程 1.2 程序翻译的过程: 2. 动静态库的理解 Linux项目自动化构建工具-make/makefile 1. 快速上手使用 2. makefile/make执行顺序的理解 前言 了解完vim编辑器的使用,接下来就可以尝…...
Windows Nginx版本升级
记录windows系统上nginx版本从1.22.1直接升级到1.25.3,全程一步到位! nginx官网: https://nginx.org/ C:\Windows\system32>cd C:\nginx# 查看当前nginx版本C:\nginx>nginx -v nginx version: nginx/1.22.1# 停止nginx服务C:\nginx>net stop ng…...
kubernetes集群 应用实践 kafka部署
kubernetes集群 应用实践 kafka部署 零.1、环境说明 零.2、kafka架构说明 zookeeper在kafka集群中的作用 一、Broker注册 二、Topic注册 三、Topic Partition选主 四、生产者负载均衡 五、消费者负载均衡 一、持久化存储资源准备 1.1 创建共享目录 [rootnfsserver ~]# mkdir -…...
Featured Based知识蒸馏及代码(3): Focal and Global Knowledge (FGD)
文章目录 1. 摘要2. Focal and Global 蒸馏的原理2.1 常规的feature based蒸馏算法2.2 Focal Distillation2.3 Global Distillation2.4 total loss3. 实验完整代码论文: htt...
CentOs 安装MySQL
1、拉取安装包 wget --no-check-certificate dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm 成功拉取 2、安装 yum install mysql-community-release-el6-5.noarch.rpm 过程中可能需要你同意一些东西,y 即可 然后稍微检查一下 yum repolist enabled…...
基于Java (spring-boot)的在线考试管理系统
一、项目介绍 系统功能说明 1、系统共有管理员、老师、学生三个角色,管理员拥有系统最高权限。 2、老师拥有考试管理、题库管理、成绩管理、学生管理四个模块。 3、学生可以参与考试、查看成绩、试题练习、留言等功能 二、作品包含 三、项目技术 后端语言&…...
5. 结构型模式 - 外观模式
亦称: Facade 意图 外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口 问题 假设你必须在代码中使用某个复杂的库或框架中的众多对象。 正常情况下, 你需要负责所有对象的初始化工作、 管理其依赖关系并按正确…...
微服务之配置中心与服务跟踪
zookeeper 配置中心 实现的架构图如下所示,采取数据加载到内存方式解决高效获取的问题,借助 zookeeper 的节点监听机制来实现实时感知。 配置中心数据分类 事件调度(kafka) 消息服务和事件的统一调度,常用用 kafka …...
链表 典型习题
160 相交链表:遍历,统计是否出现过 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(L…...
面试题:JVM 对锁都进行了哪些优化?
文章目录 锁优化自旋锁和自适应自旋锁消除锁粗化逃逸分析方法逃逸线程逃逸通过逃逸分析,编译器对代码的优化 锁优化 jvm 在加锁的过程中,会采用自旋、自适应、锁消除、锁粗化等优化手段来提升代码执行效率。 自旋锁和自适应自旋 现在大多的处理器都是…...
SSM整合实战(Spring、SpringMVC、MyBatis)
五、SSM整合实战 目录 一、SSM整合理解 1. 什么是SSM整合?2. SSM整合核心理解五连问! 2.1 SSM整合涉及几个IoC容器?2.2 每个IoC容器盛放哪些组件?2.3 IoC容器之间是什么关系?2.4 需要几个配置文件和对应IoC容器关系&…...
QT调用外部exe及无终端弹窗的解决方案、并实现进程输出信息获取
博主使用QT调用外部exe程序,外部exe程序有printf输出,起初使用的是C语言中的system()方法,但在笔记本上有概率出现终端窗口一闪而过的情况,后修改了调用方案。 1. QT调用外部exe 使用QT中的QProcess方法 #include <QProcess…...
大语言模型的三种主要架构 Decoder-Only、Encoder-Only、Encoder-Decoder
现代大型语言模型(LLM)的演变进化树,如下图: https://arxiv.org/pdf/2304.13712.pdf 基于 Transformer 模型以非灰色显示: decoder-only 模型在蓝色分支, encoder-only 模型在粉色分支, encod…...
【MySQL】外连接 where 和 on 的区别
力扣题 1、题目地址 1158. 市场分析 I 2、模拟表 User Column NameTypeuser_idintjoin_datedatefavorite_brandvarchar user_id 是此表主键(具有唯一值的列)。表中描述了购物网站的用户信息,用户可以在此网站上进行商品买卖。 Orders…...
【优化】XXLJOB修改为使用虚拟线程
【优化】XXLJOB修改为使用虚拟线程 新建这几个目录 类, 去找项目对应的xxljob的源码 主要是将 new Thread 改为 虚拟线程 Thread.ofVirtual().name("VT").unstarted 以下代码是 xxljob 2.3.0版本 举一反三 去修改对应版本的代码 <!-- 定…...
金蝶Apusic应用服务器 loadTree JNDI注入漏洞复现(QVD-2023-48297)
0x01 产品简介 金蝶Apusic应用服务器是一款企业级应用服务器,支持Java EE技术,适用于各种商业环境。 0x02 漏洞概述 由于金蝶Apusic应用服务器权限验证不当,导致攻击者可以向loadTree接口执行JNDI注入,造成远程代码执行漏洞。利用该漏洞需低版本JDK。(漏洞比较旧,8月份…...
PromptNER: Prompt Locating and Typing for Named Entity Recognition
原文链接: https://aclanthology.org/2023.acl-long.698.pdf ACL 2023 介绍 问题 目前将prompt方法应用在ner中主要有两种方法:对枚举的span类型进行预测,或者通过构建特殊的prompt来对实体进行定位。但作者认为这些方法存在以下问题…...
QT编写应用的界面自适应分辨率的解决方案
博主在工作机上完成QT软件开发(控件大小与字体大小比例正常),部署到客户机后,发现控件大小与字体大小比例失调,具体表现为控件装不下字体,即字体显示不全,推测是软件不能自适应分辨率导致的。 文…...
Kubernetes pod ip 暴露
1. k8s pod 和 service 网络暴露 借助 iptables 的路由转发功能,打通k8s集群内的pod和service网络,与外部网络联通 # 查看集群的 pod 网段和 service 网段 kubectl -n kube-system describe cm kubeadm-config networking:dnsDomain: cluster.localpod…...
442. 数组中重复的数据
数组中重复的数据 描述 : 给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。 你必须设计并实现一个时间复杂度为 O(n) 且仅使用…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
