【Linux】Linux环境基础开发工具使用(gcc/g++使用)

news2024/11/16 3:25:02

⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:Linux
⭐代码仓库:Linux
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!

Linux环境基础开发工具使用(gcc/g++使用和git的使用)

  • 前言
  • 一、gcc
    • 1、简单编译
    • 2、预处理(进行宏替换)
    • 3、编译(生成汇编)
    • 4、汇编(生成机器可识别代码)
    • 5、链接(生成可执行文件或库文件)
    • 6、快速记忆
  • 二、函数库(静态库和动态库)
    • 1、引例:ldd指令看库的位置
    • 2、库的定义(库本质也是文件)
      • (1)静态库
      • (2)动态库
    • 3、总结
  • 三、Linux项目自动化构建工具make/Makefile
    • 1、背景
    • 2、概念
    • 3、内置一个简单的gcc命令
      • (1)生成项目
      • (2)清理项目
      • (3)解释为何创建要make而清理却是make clear
      • (4)两次make
      • (5).PHONY:
    • 4、依赖关系和依赖方法
      • (1)依赖方法
      • (2)依赖关系
  • 四、sudo


前言

我们进入gcc/g++章节,下面我们用myfile.c文件进行讲解展示。
在这里插入图片描述


一、gcc

1、简单编译

gcc 文件名 -o 要命名的文件

-o后面跟着的是我们目标生成的文件。

在这里插入图片描述

2、预处理(进行宏替换)

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

在这里插入图片描述
左边为源代码,右边为预处理完的代码。
实现了我们上面所说的预处理的功能。
在这里插入图片描述

3、编译(生成汇编)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s

在这里插入图片描述
在这里插入图片描述

4、汇编(生成机器可识别代码)

通过汇编代码生成可重定向目标二进制文件,是不可以被执行的,只把我们自己写的代码进行翻译形成二进制文件。即.obj文件。

汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o

在这里插入图片描述

乱码:
在这里插入图片描述
解释不可执行:
在这里插入图片描述

5、链接(生成可执行文件或库文件)

在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello

在这里插入图片描述

有静态链接和动态链接,我们跟着后面的动静态库进行讲解。

6、快速记忆

操作符:
-ESc 键盘的左上角,记忆S是大写即可。
生成的文件后缀:
-iso 镜像文件。


二、函数库(静态库和动态库)

1、引例:ldd指令看库的位置

在这里插入图片描述

预备知识:
1、我们为什么能够在linux下进行C/C++代码的编写和编译呢?
Linux系统默认已经携带了语言级别的头文件和语言对应的库。
2、我们在安装vs2022和vs2019的时候,实际上做了一个很重要的工作是什么?
它IDE会默认给我们下载并安装语言的头文件和库文件。
3、概念:我们用的相当多的指令,比如说ls等都是用C语言写的。
在这里插入图片描述
4、如何看待我们的指令?指令就是程序就是工具。

2、库的定义(库本质也是文件)

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

(1)静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”

基本写法:libXXXXXX.a
在这里插入图片描述
在这里插入图片描述

(2)动态库

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello

libXXXXX.so

是将动态库里的我们所用的方法的地址拷贝到我的程序里面,我们去网吧是因为我们有它的地址,靠着地址进即可。
在这里插入图片描述

3、总结

1、库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器对用户的程序进行动态链接的)。
2、静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到我自己可执行程序中。
3、动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码的地址到我自己可执行程序中相关的位置。
4、静态链接成功,我们的程序不依赖任何库,自己就可以独立运行。
5、动态链接成功,我们的程序还是依赖动态库,一旦动态库缺失,我们的程序将无法运行。
6、静态库的缺点是因为自身拷贝的问题,比较浪费空间。
7、动态库的优点是因为做到可以被大家共享方法,所以真正的实现永远都是在我们对应的库中,程序内部只有地址,比较节省空间。
8、Linux默认使用的是动态链接。
在这里插入图片描述
9、一般的云服务器,默认都是只有动态库,所以我们要是想要有静态库的话,我们需要进行安装包进行链接。
安装指令为:root用户:yum install -y libc-static
普通用户:sudo yum install -y glibc-static + 自己的用户密码(这里sudo的配置在后面的第四节讲到,大家可以先去看一下下面的内容)。
c++:sudo yum install glibc-static libstdc+±static -y + 自己的用户密码

我这里已经安装过了。
在这里插入图片描述
10、来一波静态库看看效果:
在这里插入图片描述


三、Linux项目自动化构建工具make/Makefile

1、背景

1、会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
2、一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
3、makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
4、make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
5、make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

2、概念

make:是一个ming
makefile:是一个文件,一般都是在当前的源代码路径下。

3、内置一个简单的gcc命令

(1)生成项目

在这里插入图片描述

(2)清理项目

目标文件对应的依赖文件列表可以是空。在这里插入图片描述

(3)解释为何创建要make而清理却是make clear

在这里插入图片描述

在这里插入图片描述

(4)两次make

在这里插入图片描述
而我们最关键的一个问题是:我编译器怎么知道我们的可执行程序是最新的呢?我昨天make了一下创建了一个可执行程序,今天我又make一下创建原本的可执行程序,可是编译器直接不让我make了,这编译器是怎么知道我早就make过了,然后知道这已经是最新的可执行程序了呢?
回答:
我们通过对比时间来进行得知是否需要重新执行。解释一下:我们的源代码写了很长,是昨天10:05分写的,我们保存并退出,现在我们开始编译成可执行程序,到了10:06分使用了一次make,我的可执行程序就比源代码要往现在的时间来一点,所以,编译器将这两个时间作对比,可执行程序时间更往现在的时间来一点相对于源代码来讲的话,那么就第二次第三次make都不会执行,因为已经有了最新的可执行程序了,而当我们将源代码进行修改一下,那么源代码的时间就比原本生成的可执行程序要往现在的时间来一点,那么就可以用make进行编译并生成新的可执行程序。
在这里插入图片描述

方法一:
利用touch源代码
在这里插入图片描述

方法二:.PHONY:

(5).PHONY:

clean的关键字。
.PHONY是总是被执行的。即忽略时间。

由于我们上面的make只能执行一次,而我们的clean想执行多次怎么办呢?这就需要我们的关键字.PHONY:了。

在这里插入图片描述

4、依赖关系和依赖方法

makefile是一个围绕依赖关系和依赖方法构建的一个自动化的工具。

(1)依赖方法

上面的文件 myfile ,它依赖 myfile .o
myfile .o , 它依赖 myfile .s
myfile .s , 它依赖 myfile .i
myfile .i , 它依赖 myfile .c

在这里插入图片描述

(2)依赖关系

myfile依赖于myfile.c
在这里插入图片描述

四、sudo

sudo是提权,如果想要让一个普通用户能够执行sudo的话,那需要将普通用户列为可信任的白名单里,这样就可以提权进行sudo了。
在这里插入图片描述

所以我们怎么进行提权?
讲解:
1、我们先用su+超级用户root密码切换成root
在这里插入图片描述
2、看一眼权限和位置为:/etc/sudoers

在这里插入图片描述

3、下滑大概100多行左右,找到如下图所示:
在这里插入图片描述

4、修改并强制写入
在这里插入图片描述

5、退出切入到普通用户看一下成效
在这里插入图片描述

自此:告别root用户,以后用普通用户也很爽了!


家人们不要忘记点赞收藏+关注哦!!!

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

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

相关文章

【Python】猎聘网招聘数据爬虫(Python网络爬虫课设简要)

【Python】猎聘网招聘数据爬虫(Python网络爬虫课设简要) 注: 本文仅供学习交流使用! 合肥学院-20信管-20302211009 项目文件可自行前往博客主页下载或联系作者qq(3416252112)。 爬取数据耗时约50分钟&am…

网络安全工程师面试题(附答案解析)

前言 有不少小伙伴面临跳槽或者找工作,本文总结了常见的安全岗位面试题,方便各位复习。祝各位事业顺利,财运亨通。在网络安全的道路上越走越远!。 注:所有的资料都整理成了PDF,面试题和答案将会持续更新&a…

路径规划算法:基于黄金正弦优化的路径规划算法- 附代码

路径规划算法:基于黄金正弦优化的路径规划算法- 附代码 文章目录 路径规划算法:基于黄金正弦优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

Springboot事件监听

Springboot事件监听中主要有以下对象: 1、事件(event)可以封装和传递监听器中要处理的参数,如对象或字符串,并作为监听器中监听的目标。 2、监听器(listener)具体根据事件发生的业务处理模块&am…

机器学习 day14 ( 神经网络 )

神经网络的发展 最开始的动机:是通过构建软件来模拟大脑,但今天的神经网络几乎与大脑的学习方式无关 我们依据大脑中的神经网络,来构建人工神经网络模型。左图中:一个神经元可以看作一个处理单元,它有很多的输入/树突…

如何解决企业客户签收回执慢,缩短回款周期?

方案应用领域及行业 本方案适用于快消品行业的供应链管理和财务管理 方案应用背景 由于动产物权的政策变化,物权转移从交付时才开始发生效力。也就是说,新政之前,企业发出商品,开出销售发票,即可申请货物回款&#…

LLM 系列 | 05:ChatGPT Prompt的迭代优化

简介 梅子留酸软齿牙,芭蕉分绿与窗纱。日长睡起无情思,闲看儿童捉柳花。小伙伴们好,我是微信公众号 《小窗幽记机器学习》 的小编:卖冰棍的小男孩。 更多、更新文章欢迎关注微信公众号:小窗幽记机器学习。后续会持续…

Ubuntu的安装教程

文章目录 一、Ubuntu 的安装教程1、Ubuntu的镜像下载2、服务器版的安装教程2.1.1、允许 root 远程登录 3、桌面版的安装教程3.1.1、允许 root 远程登录 一、Ubuntu 的安装教程 1、Ubuntu的镜像下载 ​ 这里我选择阿里云的镜像下载你也可以选择Ubuntu的官网下载 Ubuntu官网 如…

【Set集合案例】成绩排序和不重复的随机数

Set集合案例:成绩排序和不重复的随机数 1.成绩排序 需求:用TreeSet集合存储多个学生信息(姓名,语文成绩,数学成绩),并遍历该集合 ​ 要求:按照总分从高到底出现 思路:…

都2023年了,Python 和Java 哪个更适合做自动化测试?

大家好。从事软件测试很多年了,从各个大厂一路摸爬滚打,现在我有幸供职于字节跳动。个人也是从功能测试慢慢爬到了自动化测试这条路上。所以针对这个问题,我还有点发言权。 记得我一开始从功能准备转型到自动化测试,和很多“涉事…

Qt QPushButton背景图片

一、问题 使用控件显示图片缩略图,当点击控件时,弹出窗口显示完整的图片 二、分析 应该用按钮控件,用信号槽连接。按钮控件是有参数icon,但是只能显示控件中,不能覆盖在整个控件上。 三、方法一:使用st…

线段树算法(C++/C)

目录​​​​​​​ 一、线段树算法的概念 二、为什么需要线段树 三、线段树算法的实现 (1)建树 (2)查询 (3)修改 (4)综合代码,求区间和 (5&#xff…

从“互联网+”到“互联网医疗+”,免费互联网医院开创新格局

随着互联网的发展,各行各业都在积极探索“互联网”时代下的创新模式。其中,医疗领域也开始了自己的变革之路,从传统的医疗模式转向了“互联网医疗”的新型格局。免费互联网医院的出现,则更是为这一变革注入了新的活力。 所谓“互联…

【嵌入式系统应用开发】FPGA——基于HC-SR04超声波测距

文章目录 前言环境目标结果 1 实验原理1.1 超声波原理1.2 硬件模块时序图1.3 模块说明 2 设计文件2.1 时钟分频2.2 超声波测距2.3 超声波驱动 3 实验验证3.1 编译3.3 硬件测试 总结 前言 环境 硬件 DE2-115 HC-SR04超声波传感器软件 Quartus 18.1 目标结果 使用DE2-115开发…

【Linux驱动】认识驱动(驱动的概念、驱动分类)

目录 1、什么是驱动? 2、应用程序调用驱动基本流程 3、file_operations 结构体 4、驱动的分类 1、什么是驱动? 驱动就是一段程序,能够获取外设或者传感器数据、控制外设。驱动获取到的数据会提交给应用程序。 在 Linux 中一切皆为文件&…

【实用篇】Elasticsearch02

文章目录 分布式搜索引擎021.DSL查询文档1.1.DSL查询分类1.2.全文检索查询1.2.1.使用场景1.2.2.基本语法1.2.3.示例1.2.4.总结 1.3.精准查询1.3.1.term查询1.3.2.range查询1.3.3.总结 1.4.地理坐标查询1.4.1.矩形范围查询1.4.2.附近查询 1.5.复合查询1.5.1.相关性算分1.5.2.算分…

Linux开机rc.local不自启动执行脚本问题的排查思路及问题解决

Linux开机rc.local不自启动执行脚本问题的排查思路及问题解决 问题 Linux系统中,在rc.local里面配置的启动命令等不能能够在开机的时候进行自启动 问题解决 解决问题排查中最大的麻烦,需要进行reboot重启 查看rc-local的运行状态 systemctl status r…

clickhouse简介与实战

文章目录 1:简介1.1:CH是什么?1.2:CH优缺点1.2.1:优势1.2.2:缺点 1.3:架构设计 2:CH接口3:CH引擎1:数据库引擎3.1.1:mysql引擎 2:表引擎3.2.1&…

路径规划算法:基于模拟退火优化的路径规划算法- 附代码

路径规划算法:基于模拟退火优化的路径规划算法- 附代码 文章目录 路径规划算法:基于模拟退火优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

基于flask的web应用开发——访问漂亮的html页面以及页面跳转

目录 0. 前言1. html基本知识2. 编写html文本3. 在Flask中设置访问html4. 实现点击跳转 0. 前言 本节学习如何在flask应用程序下让用户访问你提前制作好的html页面 操作系统:Windows10 专业版 开发环境:Pycahrm Comunity 2022.3 Python解释器版本&am…