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

 库分为两类:

平台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.mzph.cn/news/240729.shtml

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

相关文章

drawio绘制组织架构图和树形图

drawio绘制组织架构图和树形图 drawio是一款强大的图表绘制软件,支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用,则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部完整的集成了drawio的所有功能,并实现了云…

【一起学Rust | 框架篇 | Tauri2.0框架】Tauri2.0环境搭建与项目创建

文章目录 前言一、搭建 Tauri 2.0 开发环境二、创建 Tauri 2.0 项目1.创建项目2.安装依赖4. 编译运行 三、设置开发环境四、项目结构 前言 Tauri在Rust圈内成名已久,凭借Rust的可靠性,使用系统原生的Webview构建更小的App 以及开发人员可以灵活的使用各…

IDEA 中 Tomcat 日志乱码

1、服务器输出乱码 修改 File -> settings -> Editor -> General ->Console 中,utf-8改为GBK,反之改成utf-8 2、Tomcat Localhost Log 或者 Tomcat Catalina Log乱码 进入Tomcat 中的conf文件中的logging.properties 哪个有问题改哪个&…

虚拟机的下载、安装(模拟出服务器)

下载 vmware workstation(收费的虚拟机) 下载vbox 网址:Oracle VM VirtualBox(免费的虚拟机) 以下选择一个下载即可,建议下载vbox,因为是免费的。安装的时候默认下一步即可(路径最好…

【数据安全】Java AES加密和解密

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

Kubernetes 架构原则和对象设计

什么是 Kubernetes Kubernetes 是谷歌开源的容器集群管理系统 • 基于容器的应用部署、维护和滚动升级; • 负载均衡和服务发现; • 跨机器和跨地区的集群调度; • 自动伸缩; • 无状态服务和有状态服务; • 插件机制…

fba海派和传统海运的区别,亚马逊 FBA货物包装技巧—站斧浏览器

fba海派和传统海运的区别 1、美国FBA海派是什么? 美国FBA海派即将商品通过海洋运输的方式运送到美国亚马逊FBA仓库的服务。这种方式主要适用于大批量或大件商品,因为相比其他物流方式,海派具备成本低和运载量大的优势。 2、传统海运是什么…

编译opencv和opencv_contrib

1 下载源码 下载opencv源码https://github.com/opencv/opencv 下载opencv源码https://github.com/opencv/opencv_contrib 2 开始编译 构建需要下载ffmpeg的包,cmake构建时会自动下载,但是比较满,这里可以从下面链接直接下载 https://downloa…

ECMAScript基础入门:从语法到应用

在此之前我以及发布过关于JavaScript基础知识点大家也可以参考 大家有关于JavaScript知识点不知道可以去 🎉博客主页:阿猫的故乡 🎉系列专栏:JavaScript专题栏 🎉ajax专栏:ajax知识点 🎉欢迎关注…

C++ Qt开发:Charts折线图绘制详解

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts折线图的常用方法及灵活运用。 折线图…

C++ map和vector向量使用方法

C map用法 C 中 map 提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第一个值称之为关键字(key),每个关键字只能在 map 中出现一次;第二个称之为该关键字的对应值。 map的使用 需要导入头文件 #include …

采用线性插值的方法 在n个坐标点的基础上 准备添加一个坐标点p 根据给出p的横坐标 计算出p的纵坐标 np.interp()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 采用线性插值的方法 在n个坐标点的基础上 准备添加一个坐标点p 根据给出p的横坐标 计算出p的纵坐标 np.interp() [太阳]选择题 下列选项正确的是: import numpy as np x np.arra…

[架构之路-264]:个性特征 - 到底什么才是工程师文化?

目录 前言: 一、三种类型的商业公司与生存法则 (1)运营或销售驱动型公司 (2)产品驱动型公司 (3)技术驱动型公司 二、工程师文化特征解读1 三、工程师文化特征解读2 (1&#…

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

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

八大排序算法@直接插入排序(C语言版本)

目录 直接插入排序概念算法思想代码实现核心算法:直接插入排序的算法实现: 特性总结 直接插入排序 概念 算法思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新…

「C/C++ 01」 深拷贝和浅拷贝

目录 一、概念 1. 浅拷贝 2. 深拷贝 3. 深浅拷贝问题 4. 总结 二、在C的类中实现深拷贝 1. 拷贝构造函数 中实现深拷贝 a. 自己开辟一个新空间,然后将内容拷贝到新空间 b. 借助构造函数来实现深拷贝 2. operator 中实现深拷贝 a. 自己开辟一个新空间,…

One Wire协议应用篇(c语言板)

一.项目简介 利用DS18B20实时检测温度并显示在LCD1602显示屏上,同时可以通过K1,K2,K3,K4设置最高温度和最低温度利用AT24C02可以实现掉电不丢失,最后当检测温度大于或小于最高温时,会在LCD1602显示屏上显示OV:H或OV:L。 二.准备材料 AT89C52、…

ESP32+LVGL笔记(6)-把712k的一二级汉字字库放在SPIRAM

文章目录 1.字库制作2.字库烧录到ESP32-S3的flash2.1 配置好分区文件2.2 汉字库文件烧录到ESP32的flash 3.将字库从 flash 拷贝到 SPIRAM3.1 工程配置中有关 SPIRAM 部分3.2 将汉字库从flash拷贝到SPIRAM的代码3.3 在进入lvgl之前调用函数 copyHZK_from_flash_to_SPIRAM 在前面…

Python入门知识点分享——(八)文件的open方法

学完了Python当中的数据类型,下一步我们来了解如何用Python语言打开文件并添加内容。 目录 file mode buffering encoding errors newline closefd opener 函数 打开文件需要用到open函数,完整的语法格式如下所示,为了演示方便&…

【Linux系统基础】(1)Linux基础命令全面详解

在计算机世界中,Linux操作系统以其稳定性、安全性和开源性而受到广大程序员和系统管理员的喜爱。然而,对于初学者来说,Linux的命令行界面可能会显得有些复杂和难以理解。本文将详细介绍一些常用的Linux基础命令,帮助你更好地理解和…