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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java程序员-你真的了解死锁吗

Java程序员-你真的了解死锁吗 ​ 💕"i need your breath"💕 作者:Mylvzi 文章主要内容:死锁的成因和必要条件 ​​ ​​​​​ 一.什么是死锁 死锁:就是多个线程/进程因为相互等待而使得各自持有的资源无法继续执行&am…

❀My学习Linux小记录之UID和GID(用户ID和组ID)❀

❀My学习Linux小记录之UID和GID(用户ID和组ID)❀ 目录 ❀My学习Linux小记录之UID和GID(用户ID和组ID)❀ 用户ID(UID) 组ID(GID) 登陆 Linux 系统时,虽然输入的是自己…

Iceberg:ZOrder的实现及执行流程分析

ZOrder简介 使用Z-Order索引,可以按任意维度对数据进行排序,以获得更加高效且均衡地范围查询。它即可以作为一级索引,直接影响底层数据组织形式,甚至可以取代二索引(更加节省内存,吞吐量也理更高&#xff…

调度工具之dolphinscheduler篇

前言 随着开发程序的增多,任务调度以及任务之间的依赖关系管理就成为一个比较头疼的问题,随时少量的任务可以用linux系统自带的crontab加以定时进行,但缺点也很明细,不够直观,以及修改起来比较麻烦,容易出…

【MybatisPlus快速入门】(3)SpringBoot整合MybatisPlus 之 Lombok插件安装及MybatisPlus分页代码示例

目录 1.Lombok1.1 步骤1:添加lombok依赖 2.2 步骤2:安装Lombok的插件1.3 步骤3:模型类上添加注解2 分页功能2.1 步骤1:调用方法传入参数获取返回值2.2步骤2:设置分页拦截器2.3 步骤3:运行测试程序 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介,在这一节…

07-JVM调优工具详解及调优实战

文章目录 前置启动程序Jmap堆信息堆内存dump Jstack远程连接jvisualvm启动普通的jar程序JMX端口配置tomcat的JMX配置 jstack找出占用cpu最高的线程堆栈信息 JinfoJstat垃圾回收统计堆内存统计新生代垃圾回收统计新生代内存统计老年代垃圾回收统计老年代内存统计元数据空间统计J…

【MySQL】MySQL的数据类型

MySQL的数据类型 一、数据类型分类二、数值类型1、整数类型2、bit类型3、小数类型 三、字符串类型四、时间日期类型五、enum和set类型enum和set查找 数据类型的作用: 决定了存储数据时应该开辟的空间大小和数据的取值范围。决定了如何识别一个特定的二进制序列。 …

MySQL子查询、WITH AS、LAG查询统计数据实战

需求 给出一个比较常见的统计类业务需求:统计App(包括iOS和Android两大类)每日新注册用户数、以及累计注册用户数。 数据库采用MySQL,根据上面的需求,不难设计表如下: create table os_day_count(stat_d…

原型链污染[JavaScript]

一、原型链污染 此类型一般存在以nodejs编写的后端程序当中,其中Express是一个流行的Node.js Web应用程序框架 1.JavaScript 1.1 原理 引入 解释:直接先读代码来理解原型链污染 // let jack {b:2} console.log(typeof jack) // 它的类型是obejct con…

一文掌握分布式锁:Mysql/Redis/Zookeeper实现

目录 一、项目准备spring项目数据库 二、传统锁演示超卖现象使用JVM锁解决超卖解决方案JVM失效场景 使用一个SQL解决超卖使用mysql悲观锁解决超卖使用mysql乐观锁解决超卖四种锁比较Redis乐观锁集成Redis超卖现象redis乐观锁解决超卖 三、分布式锁概述四、Redis分布式锁实现方案…

React 中的 ref 和 refs:解锁更多可能性(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

安卓13上手势导航失效、手机卡死问题

问题描述&#xff1a;打开我们开发的app后&#xff0c;手势导航无法退回、无法回到桌面、无法切换应用。 使用设备&#xff1a;小米手机、MI14,、安卓13 未适配安卓13安卓x的情况下&#xff0c;检查自己的 AndroidManifest 文件&#xff0c;过滤器是否设置了 <category a…

信息安全等级保护的定义与意义

目录 前言 信息安全等级保护定义 广义上 狭义上 技术和管理 信息安全的基本要素 信息安全等级保护的意义 当前形式 形式严峻 国家安全 三个基本一个根本 预期目标 最终效果 实际意义 前言 信息安全等级保护是对信息和信息载体按照重要性等级分级进行保护的一种…

HTML5+CSS3+Vue小实例:彩带圣诞树

实例:彩带圣诞树 技术栈:HTML+CSS+Vue 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><…

【水文专业词汇】气象水文、水利工程等

水文专业词汇&#xff1a;气象水文、水利工程等 气象水文类水循环过程地区分类 水利工程类跨流域调水工程 参考 气象水文类 水循环过程 中文英文降水/降雨precipitation/rainfall径流runoff/streamflow产汇流runoff generation 地区分类 中文英文雨养作物区rain-fed agricu…

git入门指南:新手快速上手git(Linux环境如何使用git)

目录 前言 1. 什么是git&#xff1f; 2. git版本控制器 3. git在Linux中的使用 安装git 4. git三板斧 第一招&#xff1a;add 第二招&#xff1a;commit 第三招&#xff1a;push 5. 执行状态 6. 删除 总结 前言 Linux的基本开发工具介绍完毕&#xff0c;接下来介绍一…

游戏开发公司需要具备哪些能力?

中懿游游戏软件开发,游戏开发行业的竞争日益激烈&#xff0c;成功的游戏开发公司需要具备多方面的能力&#xff0c;从技术创新到市场推广&#xff0c;再到团队协作。以下是构建成功游戏开发公司所需的关键能力概览&#xff1a; 1. 游戏开发技术&#xff1a; 在技术方面&#…

【flink】状态清理策略(TTL)

flink的keyed state是有有效期(TTL)的&#xff0c;使用和说明在官网描述的篇幅也比较多&#xff0c;对于三种清理策略没有进行横向对比得很清晰。 全量快照清理(FULL_STATE_SCAN_SNAPSHOT)增量清理(INCREMENTAL_CLEANUP)rocksdb压缩清理(ROCKSDB_COMPACTION_FILTER) 注意&…

MySQL8.0聚合函数+over()函数

1、数据表内容为&#xff1a; CREATE TABLE chapter11 (shopname VARCHAR(255) NULL,sales VARCHAR(255) NULL,sale_date VARCHAR(255) NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;INSERT INTO chapter11 (shopname, sales, sale_date) VALUES(A…

Linux 系统调用

系统调用 在现代操作系统中&#xff0c;内核提供了用户进程与内核进行交互的一组接口。 这些接口让应用程序受限地访问硬件设备&#xff0c;提供了创建新进程并与已有进程进行通信的机制&#xff0c;也提供了申请操作系统其他资源的能力。 应用程序发出各种请求&#xff0c;而…