【Linux】2.3 编译器—gcc/g++ 项目自动化构建工具—make/Makefile

news2025/1/21 10:22:14

文章目录

  • 「gcc/g++」
    • <预处理>
    • <编译>
    • <汇编>
    • <链接>
  • 「Link?」
    • 什么是动态库、静态库
  • 「make/Makefile」
  • 「补充:sudo」
    • 信任用户

「gcc/g++」

  • vim:editor
  • gcc:compiler (C)
  • g++:compiler (C++)

编译的过程:预处理——编译(C→汇编语言)——汇编(汇编语言文件→可重定向目标二进制文件<不可执行的>)——链接(生成 可执行程序)

从 预处理 直接到 链接:
指令:gcc -o [编译所生成的文件] [要被编译的文件] 或者 gcc [要被编译的文件] -o [编译所生成的文件]
-o选项后面紧跟要生成的文件名

<预处理>

  • gcc -E [要被预处理的文件] -o [预处理所生成的文件(后缀为 .i 的文件)] (预处理并生成指定文件)
    gcc -E [要被预处理的文件](预处理后默认生成 预处理后的文件)

没有 -o 指定生成的文件都会默认生成文件,以下在 编译、汇编、链接中 同样如此。

<编译>

  • gcc -S [要被编译的文件] -o [编译所生成的文件(后缀为 .s 的文件)] (编译并生成指定文件)

这里 要被编译的文件 可以是预处理生成的 .i 文件,也可以最初始的文件。

<汇编>

  • gcc -c [要被汇编的文件] -o [汇编所生成的文件(后缀为 .o 的文件)] (汇编并生成指定文件)

这里生成的 .o 文件即使有权限也无法执行。

<链接>

  • gcc -o [编译所生成的文件] [要被编译的文件]

「Link?」

  • 为什么可以在 Linux下进行C、C++ 的文件编辑和编译?

  • 因为 Linux 系统默认已经携带了语言级别的头文件和语言对应的库

在这里插入图片描述

什么是动态库、静态库

动态库(只读):共享库
感性理解:动态库——公共卫生间;静态库——自己家的卫生间

静态链接:库里的内容直接 复制 到原代码中(占空间)
动态链接:根据库的地址找到库,读取库中的内容,默认是动态链接(节省空间)

  • 查看文件是什么链接?
    指令:file [要被检查的文件]
    在这里插入图片描述

  • 动态链接改静态链接?
    指令:gcc [被编译的文件] -o [静态链接生成的文件] -static

ps.一般的云服务器只有动态库,需要安装:

yum install -y glibc-static <C>
yum instal glibc-static libstdc++-static -y <C++>

「make/Makefile」

  • make/Makefile使用示例:
[RoundBottle@VM-12-2-centos testdir]$ touch Makefile   #👉创建 Makefile 文件
[RoundBottle@VM-12-2-centos testdir]$ ll
total 28
-rw-rw-r-- 1 RoundBottle RoundBottle     0 May 12 16:48 Makefile   #👉此时已经生成了 Makefile 的文件
-rw-rw-r-- 1 RoundBottle RoundBottle    72 May  8 08:48 test1.c
-rw-rw-r-- 1 RoundBottle RoundBottle   398 May  8 10:54 test2.c
-rw-rw-r-- 1 RoundBottle RoundBottle 17513 Apr 28 11:05 test2.i
[RoundBottle@VM-12-2-centos testdir]$ vim Makefile    #👉编辑 Makefile 文件
[RoundBottle@VM-12-2-centos testdir]$ cat Makefile    #👉 查看 Makefile 文件的内容
test2:test2.c
	gcc -o test2 test2.c

.PHONY:clean
clean:
	rm -f test2
[RoundBottle@VM-12-2-centos testdir]$ make   #👉make 指令 会从上到下 读取 Makefile 文件,并默认执行第一组依赖关系和依赖方法
gcc -o test2 test2.c         #👉此处自动输入并执行了第一个Makefile中的第一个依赖方法的指令,且生成第一个目标文件
[RoundBottle@VM-12-2-centos testdir]$ ll
total 44
-rw-rw-r-- 1 RoundBottle RoundBottle    70 May 12 16:50 Makefile
-rw-rw-r-- 1 RoundBottle RoundBottle    72 May  8 08:48 test1.c
-rwxrwxr-x 1 RoundBottle RoundBottle  8360 May 12 16:51 test2   #👉生成了被编译的文件
-rw-rw-r-- 1 RoundBottle RoundBottle   398 May  8 10:54 test2.c
-rw-rw-r-- 1 RoundBottle RoundBottle 17513 Apr 28 11:05 test2.i
[RoundBottle@VM-12-2-centos testdir]$ make clean  #👉执行第二组依赖关系和依赖方法
rm -f test2   #👉自动输入并执行指令
[RoundBottle@VM-12-2-centos testdir]$ ll
total 32
-rw-rw-r-- 1 RoundBottle RoundBottle    70 May 12 16:50 Makefile
-rw-rw-r-- 1 RoundBottle RoundBottle    72 May  8 08:48 test1.c
-rw-rw-r-- 1 RoundBottle RoundBottle   398 May  8 10:54 test2.c
-rw-rw-r-- 1 RoundBottle RoundBottle 17513 Apr 28 11:05 test2.i
  • make:command

  • Makefile:file →围绕依赖关系和依赖方法构建的一个自动编译工具(首字母大写或小写都行)

  • .PHONY:总是被执行的,被这个『.PHONY』修饰的被称为伪目标

在这里插入图片描述
注:依赖文件列表可以有多个文件,每个文件之间以 空格 分割。👆

使用示例:(分别输入指令:make 、make clean)在这里插入图片描述

  • make: 'file' is up to date. → 通过比较 已经存在的编译生成的文件的时间被编译的文件的时间 来得知文件是否是最新的。在这里插入图片描述

注:指令—touch [已经存在的文件] 可以更新文件的时间(如下示例)👇
在这里插入图片描述


「补充:sudo」

对单条指令提权:sudo [command]
→ password for 现在的账户
→那 root 不就形同虚设了?!(因为每个用户都知道自己用户的密码,输入自己账户的密码就可以对指令提权。)

所以,普通用户中只有 信任用户 可以执行 sudo 指令

信任用户

  • 如何设置信任用户?
  1. 切换到 root 用户
  2. 输入指令:vim /etc/sudoers
    在这里插入图片描述在这里插入图片描述
    在该文件中写入:示例如上,最后强制保存并退出(:wq!)
  • 如何删除信任用户?
指令:userdel -r [username]

END

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

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

相关文章

Python将图像转成像素风,圆圈、线条、波浪、十字绣、乐高积木、我的世界积木、回形针、字母......

Python将图像转成像素风,圆圈、线条、波浪、十字绣、乐高积木、我的世界积木、回形针、字母...... 1. 效果图2. 原理3. 源码参考1. 效果图 回形针效果图如下: 十字绣效果图如下: 水平线效果图如下: 垂直线效果图如下:

Spring的第十四阶段:Spring的事务管理(01)

事务管理 事务分为声明式和编程式两种: 声明式事务&#xff1a; 声明式事务是指通过 注解的形式 或 xml配置的形式 对事务的各种特性进行控制和管理。 编码式&#xff08;编程式&#xff09;事务&#xff1a; 指的是通过编码的方式实现事务的声明。 1、编码方式实现事务&…

【2023/05/13】NP完备

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第8天。 Share I sit at my window this morning where the world like a passer-by stops for a moment,nods me and goes. 译文&#xff1a; 我今晨坐在窗前&#xff0c;世界如一个过路人似的&#x…

QT多线程(线程互斥)

文章目录 前言一、导致问题产生的原因和解决方法二、同时访问一个临界资源带来的问题三、QMutex线程锁4.线程死锁5.解决死锁的方法总结 前言 线程互斥是指在多线程并发执行时&#xff0c;为避免多个线程访问共享资源时发生冲突而采取的一种机制。本篇文章我们就这个问题来了解…

c++学习之mystring的简单封装

我们经常利用string类实例化对象来对字符串进行各种操作&#xff0c;string类是一个实用的类&#xff0c;那么对于string类的一些基本操作是如何实现的呢&#xff1f;我们简单的实现一下mystring的封装。 目录 1.常用的字符串函数 2.构造函数的创建 1.无参构造 2.有参构造…

Java面试知识点(全)- Java面试基础部分二

[Java面试知识点(全)(https://nanxiang.blog.csdn.net/article/details/130640392)&#xff1a; 导航&#xff1a; https://nanxiang.blog.csdn.net/article/details/130640392 注&#xff1a;随时更新 TPS&QPS TPS&#xff1a;是Transactions PerSecond的缩写&#xff0…

elment-ui/plus不定高度容器收缩折叠动画组件

文章目录 学习链接效果代码 学习链接 原生js手动实现一个多级菜单效果&#xff08;高度可过渡变化&#xff09; - 自己的链接 vue实现折叠展开收缩动画 - 自己的链接 效果 代码 在使用element-plus的折叠组件的时候&#xff0c;一般用的是<el-collapse>组件&#xff0…

Vector - CAPL - CANoe硬件配置函数 - 04

目录 getChipType -- 确定当前所用的CAN控制器类型 代码示例 setCanCabsMode -- 设置 CANcab 模式 代码示例 setOcr -- 设置输出寄存器 代码示例 setBtr -- 设置位时序寄存器BTR 代码示例 getChipType -- 确定当前所用的CAN控制器类型 功能&#xff1a;确定所用 CAN 控制…

身边不动点定理的有意思应用

最近读高观点下的数学这本书&#xff0c;对书中介绍的布劳威尔不动点定理的有趣性质印象很深&#xff0c;原因是这个定理的某些性质能够解释我们生活中的一些常见现象&#xff0c;这里结合一个例题&#xff0c;聊以记录。 从一个数学题讲起&#xff1a; f(x)是定义在[0,1]上的…

Netty 服务端开发及性能优化

Netty 是一个异步基于事件驱动的高性能网络通信框架&#xff0c;可以看做是对 NIO 和 BIO 的封装&#xff0c;并提供了简单易用的 API、Handler 和工具类等&#xff0c;用以快速开发高性能、高可靠性的网络服务端和客户端程序。 1. 创建服务端 服务端启动需要创建 ServerBoot…

面试官说,Java中的volatile关键字有什么作用?

在Java中&#xff0c;volatile是一个关键字&#xff0c;它用于标记变量&#xff0c;以指示该变量可能随时被多个线程访问并修改。从面试的角度来看&#xff0c;了解volatile关键字的作用和原理对于Java开发人员来说非常重要。在本文中&#xff0c;我将详细讲解volatile关键字的…

springboot+vue班级综合测评管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的班级综合测评管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1…

prometheus中通过node-exporter中的--collector.textfile.directory这一选项参数自定义监控指标

简述node-exporter中该选项参数的作用。 --collector.textfile.directory 是 Node Exporter 的一个命令行选项&#xff0c;用于指定从 textfile 收集器中收集数据的目录。 Node Exporter 会通过各种方式收集主机的度量值&#xff0c;并将这些度量值暴露给 Prometheus。其中之…

【嵌入式烧录刷写文件】-2.3-删除/修改Intel Hex文件中指定地址范围内的数据

案例背景&#xff08;共6页精讲&#xff09;&#xff1a; 有如下一段HEX文件&#xff0c;如何“自动”地完成地址范围0x9110-0x9113数据的删除或修改。 :2091000058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775F :2091200078797A7B7C7D7E7F808182838485…

C++ STL之 list 基础

文章目录 前言STL之list基础知识1. list的介绍2. list的使用2.1 list的构造2.2 list iterator的使用2.3 空间相关2.4 元素访问2.5 相关函数2.6 list的迭代器失效 3. list与vector的对比 后记 前言 本篇将学习 list 的基础知识 &#x1f57a;作者&#xff1a; 迷茫的启明星 专栏…

网络安全从业人员职业发展和规划

1、为什么做这次分享&#xff1f; 2、人生周期三模型 3、职业生涯阶段划分 4、通用职业发展路径 5、当前安全行业前景如何&#xff1f; 6、安全就业行情如何&#xff1f; 7、安全行业就业市场岗位划分 8、什么是相对比较好的履历&#xff1f; 9、选择甲方还是选择乙方&#xf…

Prompt learning 教学[技巧篇]:通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案

Prompt learning 教学[技巧篇]&#xff1a;通过增加示例、引导词、特殊符号指令等方式让chatgpt输出更好的答案 技巧1&#xff1a;To Do and Not To Do 在问答场景里&#xff0c;为了让 AI 回答更加准确&#xff0c;一般会在问题里加条件。比如让 AI 推荐一部电影给你 Recomme…

【高数+复变函数】傅里叶变换

文章目录 【高数复变函数】傅里叶变换3 傅里叶变换3.1 基本概念3.2 单位脉冲函数及其傅里叶变换3.3 非周期函数的频谱 上一节 【高数复变函数】傅里叶积分 【高数复变函数】傅里叶变换 3 傅里叶变换 3.1 基本概念 回顾&#xff1a;上一节中的Fourier积分公式 f ( t ) 1 2…

前端二进制流的关系

Blob 全称&#xff1a;binary large object&#xff0c;二进制大对象&#xff0c;是一个js对象&#xff0c;可以用来存储大量二进制编码格式的数据&#xff0c;Blob对象是不可修改的&#xff0c;读取内容的唯一方法是FileReader。 创建一个Blob对象&#xff1a; new Blob(ar…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--后端实现

目录 SSM(Vue3ElementPlusAxiosSSM前后端分离)--后端实现 技术栈 实现功能04-添加家居信息 需求分析/图解 思路分析 代码实现 创建\service\FurnService.java 和\service\FurnServiceImpl.java, 增加添加方法 修改Furn.java , 当创建Furn 对象imgPath 为null 时, imgPa…