【Linux基础开发工具】gcc/g++使用make/Makefile

news2025/1/20 6:15:57

目录

前言

 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标准库

 库分为两类:

平台LinuxWindows
动态库.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就可以不指明目标文件?

  1. Makefilemake形成文件的时候,默认是从上到下扫描makefile文件,默认形成第一个目标文件

在重复执行的时候,会显示当前的目标文件已经是最新的,那makemakefile是如何知道可执行程序是比较新的呢?

这个其实是通过对比时间比起来的,只要可执行程序的最近修改时间比所有源文件的最近修改时间新,说明它就是最新的!

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用于自动化构建过程,特别是在大型项目中。熟悉和掌握这些工具的基本用法对于软件开发人员来说也是非常重要的,以上便是本文的全部内容,最后感谢阅读!

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

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

相关文章

解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透)

解决Unity物体速度过快无法进行碰撞检测(碰撞检测穿透) 一、解决碰撞检测穿透方法一Collision Detection碰撞检测总结: 二、解决碰撞检测穿透方法二 一、解决碰撞检测穿透方法一 首先我们知道只要是跟碰撞相关的基本都是离不开刚体 Rigidbod…

海康威视运行管理中心 Fastjson RCE

漏洞描述 海康威视运行管理中心系统存在低版本Fastjson远程命令执行漏洞,攻击者可在未鉴权情况下获取服务器权限,且由于存在相关依赖,即使服务器不出网无法远程加载恶意类也可通过本地利用链直接命令执行,从而获取服务器权限。 漏…

nodejs+vue+ElementUi会员制停车场车位系统

总之,智能停车系统使停车场管理工作规范化,系统化,程序化,避免停车场管理的随意性,提高信息处理的速度和准确性,能够及时、准确、有效的查询和修改停车场情况。 三、任务:小组任务和个人任务 智…

vue3 登录页和路由表开发

目录 应用场景/背景描述: 开发流程: 详细开发流程: 总结/分析: 背景描述 在上一篇的基础上开始开发,element-plusvue3 上一篇说道详细迁移的过程,如下: 所以我这篇开始了第一步&#xff0c…

Shell编程从入门到实战

Shell 概述 (1)Linux 提供的 Shell 解析器有 [rootflinkTenxun ~]# cat /etc/shells(2)bash 和 sh 的关系 [rootflinkTenxun bin]# ll | grep bash(3)Centos 默认的解析器是 bash [rootflinkTenxun bin]…

从Maven初级到高级

一.Maven简介 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。 一个 Maven 工程有约定的目录结构,约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环,就拿自动编译来说,Maven 必须 能…

安装nodejs,配置环境变量并将npm设置淘宝镜像源

安装nodejs并将npm设置淘宝镜像源 1. 下载nodejs 个人不喜欢安装包,所以是下载zip包的方式。这里我下载的node 14解压包版本 下载地址如下:https://nodejs.org/dist/v14.15.1/node-v14.15.1-win-x64.zip 想要其他版本的小伙伴去https://nodejs.org/di…

【C++】bind绑定包装器全解(代码演示,例题演示)

前言 大家好吖,欢迎来到 YY 滴C系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Linux》…

7ADC模数转换器

一.模数转换原理 ADC模拟-数字转换器可以将引脚上连续变化的模拟电压转换成内存中存储的数字变量,建立模拟电路到数字电路的桥梁。另外一种是DAC既是与前面相反,如PWM波,由于PWM电路简单且没有额外的功率损耗,更适用于惯性系统的…

HarmonyOS4.0系统性深入开发02 UIAbility组件详解(上)

UIAbility组件概述 概述 UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。 UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实例…

基于Java SSM框架实现列车火车高铁票务信息管理系统项目【项目源码+论文说明】

基于java的SSM框架实现列车火车高铁票务信息管理系统演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被…

Linux学习笔记8-Uboot移植-网络设置和其他坑的解决

Linux之所以被称为操作系统,肯定是需要有引导程序来启动各个关键外设的运行,这里可以和个人电脑PC做个类比。我们在开机的时候是不是先要进入BIOS,BIOS在初始化硬盘、内存、USB接口、网口等之后,才可以进入Windows系统对吧&#x…

limma:单通道数据和RNA-seq数据差异性分析标准方法

前言 单通道数据极为流行,三大公司:Affymetrix、Illumina和Agilent的微阵列(microarray)技术产生的很多都是单通道数据。现在的主力的高通量测序机所产生的也是单通道数据,所以只要是被voom标准化(包括了l…

Unity中Shader观察空间推导

文章目录 前言一、本地空间怎么转化到观察空间二、怎么得到观察空间的基向量1、Z轴向量2、假设 观察空间的 Y~假设~ (0,1,0)3、X Y 与 Z 的叉积4、Y X 与 Z 的叉积 三、求 [V~world~]^T^1、求V~world~2、求[V~world~]^T^ 四、求出最后在Unity中使用的公式1、偏移坐标轴2、把…

Redis可视化工具Redis Desktop Manager mac功能特色

Redis Desktop Manager mac是一款非常实用的Redis可视化工具。RDM支持SSL / TLS加密,SSH隧道,基于SSH隧道的TLS,为您提供了一个易于使用的GUI,可以访问您的Redis数据库并执行一些基本操作:将键视为树,CRUD键…

vcruntime140_1.dll文件下载安装方法分享,如何安全修复vcruntime140_1.dll

遇到vcruntime140_1.dll文件遗失是用户在使用Windows操作系统时较为普遍遭遇到的一个问题,它归类于动态链接库(DLL)文件缺失的常见情形。在今天的内容里,我们将深入探讨如何正确地下载和安装vcruntime140_1.dll文件,以…

《操作系统A》期末考试复习题——大题51-62(手写笔记)

51、如果限制为两道的多道程序系统中,有4个作业进入系统,其进入系统时刻、估计运行时间为下图所示。系统采用SJF作业调度算法,采用SRTF进程调度算法。作业进入系统时刻、估计运行时间如下: 作业 进入系统时刻 估计运行时间/min …

php反序列化漏洞原理、利用方法、危害

文章目录 PHP反序列化漏洞1. 什么是PHP反序列化漏洞?2. PHP反序列化如何工作?3. PHP反序列化漏洞是如何利用的?4. PHP反序列化漏洞的危害是什么?5. 如何防止PHP反序列化漏洞?6. PHP反序列化漏洞示例常见例子利用方法PH…

关于pygame无法打开对应文件解决办法 pyame.error unable to open file

问题描述: 问题原因: 由于pygame版本过低导致无法进行声音播放,升级对应版本即可完成! 解决办法: 升级pygame包版本到2.1.2,即可解决该问题! pip install --upgrade pygame2.1.2

html旋转相册

一、实验题目 做一个旋转的3d相册 二、实验代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport&qu…