【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.hqwc.cn/news/295042.html

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

相关文章

springboot使用Validated实现参数校验

做为后端开发人员,一定有前端传的数据是可能会出错的警惕性,否则程序就可能会出错,比如常遇到的空指针异常,所以为了程序运行的健壮性,我们必须对每一个参数进行合法校验,就能避免很多不必要的错误&#xf…

力扣单调栈算法专题训练

目录 1 专题说明2 训练 1 专题说明 本博客用来计算力扣上的单调栈题目、解题思路和代码。 单调栈题目记录: 2232866美丽塔II 2 训练 题目1:2866美丽塔II。 解题思路:先计算出prefix[i],表示0~i满足递增情况下,0~i…

html旋转相册

一、实验题目 做一个旋转的3d相册&#xff0c;当鼠标停留在相册时&#xff0c;相册向四面散开 二、实验代码 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" con…

【数据结构之单链表】

数据结构学习笔记---003 数据结构之单链表1、什么是单链表?1.1、概念及结构 2、单链表接口的实现2.1、单链表的SList.h2.1.1、定义单链表的结点存储结构2.1.2、声明单链表各个接口的函数 2.2、单链表的SList.c2.2.1、遍历打印链表2.2.2、销毁单链表2.2.3、打印单链表元素2.2.4…

三级安全教育二维码的应用

三级安全教育是指公司、项目经理部、施工班组三个层次的安全教育&#xff0c;是工人进场上岗前必备的过程&#xff0c;属于施工现场实名制管理的重要一环&#xff0c;也是工地管理中的核心部分之一&#xff0c;目前很多公司已经逐步开始使用系统来进行管理&#xff0c;下面我们…

Python数据科学视频讲解:特征归一化、特征标准化、样本归一化

5.1 特征归一化、特征标准化、样本归一化 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解5.1节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应用的全流程&#…

软件测试 —— 冒烟测试(Smoke Test,ST)

1. 核心 冒烟测试就是完成一个新版本的开发后&#xff0c;对该版本最基本的功能进行测试&#xff0c;保证基本的功能和流程能走通。 如果不通过&#xff0c;则打回开发那边重新开发&#xff1b; 如果通过测试&#xff0c;才会进行下一步的测试(功能测试&#xff0c;集成测试&a…

css画三角形

css画三角形 <!doctype html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0"&g…

JavaScript:对象

JavaScript&#xff1a;对象 对象是什么对象的定义对象的组成 对象的使用对象声明利用函数声明直接声明 访问对象对象方法的调用增加与改变对象属性删除对象属性遍历对象 内置对象Math对象属性方法 对象是什么 对象的定义 对象是 JavaScript 数据类型的一种&#xff0c;之前已…

Mac电脑上soucetree账户更改

在开发公司项目的时候遇到一个问题。soucetree提示需要输入已离职员工-张三的密码。 问题&#xff1a;Mac电脑使用souetree&#xff0c;拉取仓库代码提示需要输入其他员工密码。 解决&#xff1a; Mac电脑 SourceTree去掉之前的账户 1、前往文件路径 /Library/Application Su…

【WPF.NET开发】创建模板

本文内容 何时创建 ControlTemplate先决条件创建 ControlTemplate使用模板添加触发器使用 VisualState 使用 Windows Presentation Foundation (WPF)&#xff0c;可以使用自己的可重用模板自定义现有控件的可视结构和行为。 可以对应用程序、窗口和页面全局应用模板&#xff…