【Linux】Linux环境基础开发工具使用(下)

【Linux】Linux环境基础开发工具使用(下)

🥕个人主页:开敲🍉

🔥所属专栏:Linux🍊

🌼文章目录🌼

4. Linux编辑器--gcc /g++的使用

    4.1 背景知识

    4.2 gcc如何完成

        4.2.1 预处理

        4.2.2 编译

        4.2.3 汇编

        4.2.4 链接

        4.2.5 重要概念:函数库

        4.2.6 gcc选项

5. Linux调试器-Gdb使用

    5.1 背景

    5.2 使用

    5.3 理解

          5.3.1 Linux项目自动化构建工具 - make/makefile

6. Linux 第一个小程序 - 进度条

  7. 使用git命令行

    7.1 安装git

    7.2 使用Gitee创建项目

        7.2.1 创建账号

        7.2.2 创建项目

    7.3 上传文件三板斧

        7.3.1 第一板斧:git add

        7.3.2 第二板斧:git commit

        7.3.3 第三板斧:git push

4. Linux编辑器--gcc /g++的使用
    4.1 背景知识

1. 预处理:进行宏替换,去注释等操作

2. 编译:生成汇编

3. 汇编:生成机器可以识别的代码

4. 链接:生成可执行文件

    4.2 gcc如何完成

  格式:gcc [选项] 要编译的文件 [选项] 生成的目标文件

        4.2.1 预处理

预处理功能主要包括宏定义,文件包含,条件编译,去注释等;

预处理指令是以#号开头的代码行;

实例: gcc –E hello.c –o hello.i (生成预处理后的 .i 文件);
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程;
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序;

        4.2.2 编译

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言;

用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码;

实例: gcc –S hello.i –o hello.s;(生成编译后的 .s 文件)

        4.2.3 汇编

汇编阶段是把编译阶段生成的“.s”文件转成目标文件;

读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了;

实例: gcc –c hello.s –o hello.o;(生成汇编后的 .o 文件)

        4.2.4 链接

在成功编译之后,就进入了链接阶段;

实例: gcc hello.o –o hello;(将汇编后的文件生成可执行程序)

        4.2.5 重要概念:函数库

  我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

  最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

函数库一般分为静态库和动态库两种:

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

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

gcc hello.o//汇编后生成的.o文件 -o hello//生成的目标文件

  gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。使用 file + 生成的目标文件名即可看到目标文件链接时采用的是动态库还是静态库。

        4.2.6 gcc选项

-E:只激活预处理,意思是当程序跑完预处理阶段后就停下来,生成一个预处理后的文件

-S:激活到编译,意思是程序跑到编译阶段后停下来,生成一个编译后的文件

-c:编译到目标代码

-o:最终生成一个可执行程序

-static:在链接时强制系统使用静态库进行链接

-g:生成调试信息。GNU调试器可利用该信息

-shared:此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库

-w:不生成任何警告信息

-Wall:生成所有警告信息

5. Linux调试器-Gdb使用
    5.1 背景

  ① 程序的发布方式有两种,debug模式和release模式。

  ② Linux gcc/g++出来的二进制程序,默认是 release 模式。

  ③ 要使用 gdp 调试,必须在源代码生成二进制程序的时候,加上 -g 选项。

    5.2 使用

  gdb binFile 退出:ctrl + d 或者 quit 调试命令;

list / | 行号:显示 binFile 源代码,接着上次的位置往下列,每次列10行。

list / | 函数名:列出某个函数的源代码。

r 或 run:运行程序。

n 或 next:单条执行。

s 或 step:进入函数调用。

break(b):行号:在某一行设置断点。

break 函数名:在某个函数开头设置断点。

info break:查看端点信息。

finish:执行到当前函数返回,然后挺下来等待命令。

printf(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数。

p 变量:打印变量值。
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
quit:退出gdb

    5.3 理解
          5.3.1 Linux项目自动化构建工具 - make/makefile

背景

  ① 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。

  ② 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。

  ③ makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

  ④ make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

  ⑤ make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

理解

  看下面的例子:

//创建一个 .c 文件 test.c
touch test.c
//在这个文件内部我们写入一个最简单的代码

//创创建一个名为 makefile 的文件
touch makefile
//在这个文件内部我们可以写入如下代码

  此时我们在命令行中输入:make

就会自动执行 makefile 中我们写入的命令。

原理

   make会在当前目录下找名字叫“Makefile”或“makefile”的文件。

  ② 如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“test”这个文件,并把这个文件作为最终的目标文件。

  ③ 如果test文件不存在,或是test所依赖的后面的test.o文件的文件修改时间要比 test 这个文件新(可以用 touch 测试),那么,他就会执行后面所定义的命令来生成 test 这个文件。

  ④ 如果test所依赖的test.o文件不存在,那么make会在当前文件中找目标为test.o文件的依赖性,如果找到则再根据那一个规则生成test.o文件。(这有点像一个堆栈的过程)

  ⑤ 当然,你的C文件和H文件是存在的啦,于是make会生成 hello.o 文件,然后再用 hello.o 文件声明make的终极任务,也就是执行文件hello了。

  ⑥ 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。

  ⑦ 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。

  ⑧ make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

项目清理

  ① 工程是需要被清理的。

  ② 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。

  ③ 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。

  那么什么叫总是被执行呢?什么又是不被执行?来看下面的命令执行情况:

  上面就是 不被执行 的情况:重复无意义的编译代码

  如果我们将 test.c 中的代码进行更改呢?

  现在再来看看 make 命令能否执行:

  可以看到,现在make命令就又可以执行了。

  也就是说,当编译过了一次 test.c 后,如果我们对文件中的代码进行更改,再次执行 make 是可以做到的。

  那么我们如果不想更改文件的代码,就是想让这个文件重复被编译呢?这时候就要用到我们 .PHONY 来修饰了:

  此时我们再重复地执行 make 就可行了:

  这时我们就可以引入 clean了:

  clean 就帮助我们清理生成的多余的中间文件,并且用 .PHONY 修饰,可以重复执行:

6. Linux 第一个小程序 - 进度条

进度条代码

#include "progressbar.h"                                                                                                                                                               2 #include <string.h>3 #include <unistd.h>4 #define NUM 1005 #define STYLE '*'6 7 void progressbar(double total,double current)8 {9     char buff[NUM];10     double progress = current*100/total;11     memset(buff,0,sizeof(buff));12 13     const char* lable = "|/-\\";14     int len = strlen(lable);15     int num = (int)(current*100/total);16     for(int i = 0;i<num;i++)17         buff[i] = STYLE;18 19     printf("[%-100s][%.2f%%][%c]\r",buff,progress,lable[num%len]);20     fflush(stdout);21 }
  7. 使用git命令行
    7.1 安装git

Centos:sudo yum install git

Ubuntu:sudo apt install git

    7.2 使用Gitee创建项目
        7.2.1 创建账号

  这个很简单,在这里不作赘述,自行去官网注册即可。

        7.2.2 创建项目

  登录成功后,进入个人主页,点击右上角头像傍边的 + 号,选择创建仓库:

                                

  进入后对你的仓库进行操作:

  创建好仓库后在右上角点击橙色的按钮:

                                  

  点击复制:

  随后打开 Xshell,在你的用户中选择一个你喜欢的位置,创建一个目录,用来存放这个仓库。

  进入目录后,输入:

git clone 在这里粘贴刚刚复制的内容

  随后回车,仓库就拷贝进来了。

    7.3 上传文件三板斧
        7.3.1 第一板斧:git add

  将文件放入刚刚 clone 好的目录中:

git add 文件名/.   这里 . 表示当前目录下所有文件,即表示将当前目录下所有文件放入目录中

        7.3.2 第二板斧:git commit

  将刚刚 add 好的文件改动到本地:

git commit .    这里 . 表示当前目录下所有文件

        7.3.3 第三板斧:git push

  同步到远端服务器上:

git push  后面什么也不用跟,就是 git push

  需要填入用户名密码. 同步成功后, 刷新 Gitee 个人主页页面就能看到代码改动了。

                                               创作不易,点个赞呗,蟹蟹啦~

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

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

相关文章

GPU性能测试,环境搭建笔记,transformers/huggingface_hub改国内源,BertLayer import 报错

代码&#xff0c;以及测试方案使用的是沐神的代码 github的代码&#xff1a; 1. 环境搭建 首先是安装torch 这是我的pytorch版本 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124使用pip指令安装transformers transformers…

PR剪辑视频去重消重色彩叠加特效模板

采用现代设计&#xff0c;灵感来自鲜艳的色彩和动态的灯光效果。包含颜色控制选项&#xff0c;能够轻松地调整效果以匹配您的视频风格。具有图像和视频替换功能。 易用性&#xff1a;适合所有经验水平的用户&#xff0c;包括初学者。 调色板自定义&#xff1a;完全控制颜色以匹…

采购管理软件选择攻略:别忽视这些注意事项

企业在选择采购管理软件时必须谨慎&#xff0c;因为这直接关系到简化采购流程、成本控制、风险降低和效率提升等多个方面。面对内众多的软件选项和竞争目标&#xff0c;采购团队可能难以做出正确的选择。别担心&#xff0c;本文将提供一些建议和注意事项。 采购管理软件的重要性…

关于 npm 更新镜像源问题

npm&#xff08;Node Package Manager&#xff09;&#xff0c;是一个NodeJS包管理和分发工具&#xff0c;已经成为了非官方的发布Node模块&#xff08;包&#xff09;的标准。&#xff09; 查看当前npm版本 npm -v 10.9.0 执行以下命令报错 npm install --registryhttp…

【OceanBase 诊断调优】—— OceanBase 数据库统计信息被禁用,状态为 broken 的原因和解决方法

问题现象 因为人为因素导致部分统计信息函数未安装&#xff0c;自动统计信息触发执行长期失败。重新安装统计信息相关函数后&#xff0c;发现仍然无法正常自动统计信息收集&#xff0c;统计信息状态为 broken。 问题原因 统计信息 JOB 收集失败次数达到 16 次会直接禁用 JOB …

2024腾讯云双十一必抢清单:省钱、省心、省力的购买攻略

一、前言 大家好&#xff0c;我是 Neo&#xff01;一年一度的双十一购物狂欢节又到了&#xff01;在这个特别的日子&#xff0c;腾讯云也推出了超值的优惠活动。最近我正好在做自己的小程序项目&#xff0c;需要用到服务器&#xff0c;特意关注了这次活动&#xff0c;看看有没…

业财税深度融合,金鹰国际集团以数字化打造硬实力

数字经济时代&#xff0c;企业数字化转型已成必然&#xff0c;越来越多的企业踏浪前行&#xff0c;加速探索全领域的数字化转型&#xff0c;获得竞争优势。数字化技术的快速发展也加速了税收征管改革进程&#xff0c;财务数字化成为企业转型升级的有力抓手&#xff0c;助力优化…

Spring Boot 多环境开发配置详解:Profiles 的使用指南

目录 前言1. Profiles 简介1.1 什么是 Profiles&#xff1f;1.2 Profiles 的应用场景 2. 单文件配置方式2.1 使用三横杠 --- 分隔配置2.2 指定哪个环境的配置生效 3. 多文件配置方式3.1 配置文件的创建与命名3.2 多文件配置的优点 4. Profiles 分组管理4.1 Profile 分组的配置4…

emp.dll文件丢失的几种方法-常见问题

emp.dll文件在Windows系统中扮演着重要的角色&#xff0c;其作用不仅限于单一的应用程序或游戏。以下是emp.dll在系统中的几种作用&#xff1a; 图形渲染与游戏支持&#xff1a;emp.dll可能集成了高效的渲染引擎&#xff0c;支持复杂的3D图形和动画&#xff0c;为玩家提供沉浸…

永久免费!星火大模型接口源码分享(支持上下文、连续对话和历史对话保存)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 星火大模型 📒🌟 接口功能📜 源码分享🎯 使用方法⚓️ 相关链接 ⚓️📖 介绍 📖 你是否在寻找一款国产的、永久免费的大模型接口?想要在自己的项目中轻松集成强大的自然语言处理能力?今天,将为你分享一份免费的星…

小型内衣洗衣机哪个牌子好?五大超值优等品速来围观!

小型洗衣机的存在无疑是懒人的福音&#xff0c;它帮助了许多忙碌的人们解决了洗衣烦恼。尤其对于年龄较小的婴幼儿需要勤换衣、洗衣的时候&#xff0c;它的功能就显得尤为重要了&#xff0c;同时还能够用于清洗大人的内衣裤、袜子这一系列的贴身衣物。小型洗衣机通常用于宿舍、…

取代产品岗,又一新兴岗位在崛起!这才是产品经理未来5年最好的就业方向!

这是我入行产品经理的第1007天&#xff1a; 每天都是整理需求、开会、写文档、协调资源 被开发、运营diss一通&#xff0c;顺便为产品“背个锅” 熬夜加班做出来的产品&#xff0c;业务团队还是不愿意用…… 更让人头秃的是&#xff0c;干了3年&#xff0c;好像到了“职…

打造自己的RAG解析大模型:(可商用)智能文档服务上线部署

通用版面分析介绍 版面解析是一种将文档图像转化为机器可读数据格式的技术&#xff0c;广泛应用于文档管理和信息提取等领域。通过结合OCR、图像处理和机器学习&#xff0c;版面解析能够识别文档中的文本块、图片、表格等版面元素&#xff0c;最终生成结构化数据&#xff0c;大…

Spring

1、Spring框架中单例bean是线程安全的吗&#xff1f; 不是线程安全的。当多用户同时请求一个服务时&#xff0c;容器会给每个请求分配一个线程&#xff0c;这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改&#xff0c;比如修改单例的成员属性&#xff0c;就必…

MathGPT的原理介绍,在中小学数学教学的应用场景,以及代码样例实现

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下MathGPT的原理介绍&#xff0c;在中小学数学教学的应用场景&#xff0c;以及代码样例实现。MathGPT的核心架构是一个精心设计的多层次系统&#xff0c;旨在有效处理复杂的数学问题。其主要组成部分包括 数学知识图谱…

【Linux】man 手册的使用指南

man 手册的使用指南 man手册中文版上传至资源&#xff08;用心整理&#xff0c;感谢理解&#xff01;&#xff09; man手册官方下载链接&#xff1a;https://mirrors.edge.kernel.org/pub/linux/docs/man-pages/ man 手册页&#xff1a;https://linux.die.net/man/ Linux man…

机器学习分析scRNA-seq解析急性髓系白血病中的疾病和免疫过程

急性髓性白血病&#xff08;AML&#xff0c;Acute myeloid leukemia&#xff09;是一种存在于复杂微环境中的疾病。作者基于scRNA-seq分析了来自40例骨髓抽吸donor的38,410个细胞&#xff0c;包括16例AML患者和5例健康donor。然后&#xff0c;应用机器学习分类器来区分恶性细胞…

【缓存策略】你知道 Write Back(回写)这个缓存策略吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

1小时构建Vue3知识体系-Vue的响应式,让数据动起来

本文转载自&#xff1a;https://fangcaicoding.cn/course/12/62 大家好&#xff01;我是方才&#xff0c;目前是8人后端研发团队的负责人&#xff0c;拥有6年后端经验&3年团队管理经验。 系统学习践行者&#xff01;近期在系统化输出前端入门相关技术文章&#xff0c;期望能…

Docker网络详解

安装Docker时&#xff0c;它会自动创建三个网络&#xff0c;bridge&#xff08;创建容器默认连接到此网络&#xff09;、 none 、host 网络模式简介Host容器将不会虚拟出自己的网卡&#xff0c;配置自己的IP等&#xff0c;而是使用宿主机的IP和端口。Bridge此模式会为每一个容…