Linux 基础开发工具

article/2025/11/5 13:19:21

一.Linux编译器-gcc/g++

1. 背景知识
1.预处理(进行宏替换)
2.编译(生成汇编)
3.汇编(生成机器科识别代码)
4.链接(生成可执行文件或程序)
2. gcc 如何完成
预处理 ( 进行宏替换 )
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行.
实例:gcc -E main.c -o main.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查 无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc -S main.i -o main.s
汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc -c main.o -o main.o
链接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段。
实例: gcc main.o -o main
在这里涉及到一个重要的概念 : 函数库
在c语言中并没有定义“printf”函数的实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而并没有定义该函数的实现,那么是在哪里实现printf函数的?这时候就用到函数库。
系统将这些函数的实现都做到一个lib.so.6的库文件中,在没有特别指定时,gcc会到系统默认的路径下查找,也就是链接到lib.so.6库函数中去,就可以实现printf函数了。
函数库一般分为静态库和动态库
静态库:将库中使用到的函数直接写入到可执行程序中,生成的可执行程序大,内存中会有冗余                  代码,但是不会产生运行依赖。
动态库:将库中函数的符号信息表记录到可执行程序中,生成的可执行程序较小,内存中没有冗                  余代码,但会产生运行依赖。 
gcc编译器默认链接方式:动态链接

二、gdb调试器

1.背景知识
程序的发布方式有俩种:debug 和 release,在LLinux gcc/g++出来的二进制程序,默认是release模式,在release模式下不能进行调试,所以 要使用gdb调试时候,必须要在生成二进制程序的时候加上  -g  选项
gcc -g main.o -o main
2.gdb调试命令
(1)加载程序:gdb ./main
(2)开始调试:start  run(开始运行)
(3)逐步调试:next (相当于c语言中F10)       step(相当于c语言中F11)
                           until main.c:5  (直接运行到main.c的第5行)
                           list main.c:5    (查看main.c的第5行附件的代码)
(4)断点调试:break main.c:8   (在main.c的第8行设置一个断点)
                           break 函数名      (直接在函数上设置断点)
                          ​​​​​​​  info break           (查看断点信息)
delete 编号         (删除断点)
print 变量=10      (查看或者设置变量信息)

 

三、make&makefile (项目化自动构建工具)

1.背景知识

在gcc/g++下,要想得到可执行程序,需要经过预处理,编译,汇编,链接这四步,如下:

 

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

 

make解释规则:

1.make查找第一个目标对象(Makefile中第一个对象),作为生成最终对象

2.检测依赖对象和目标对象的时间关系,判断目标对象是否需要重新生成

目标对象不存在,需要重新生成          目标对象存在后依赖对象重新修改,目标对象重新生成

(若目标对象需要生成,但依赖对象不存在,则会先生成依赖对象)

3.make在完成终极目标对象后,即Makefile中第一个对象,就会结束退出,因此,如果后面还有其他对象,不是目标对象的依赖对象,则不会生成,需要通过make指令指定生成

例:

在执行make时,并没有生成Makefile中的clean 这条命令,只生成了终极对象main。所以,要想生成clean目标对象,需要我们指定生成 make clean

4.(.PHONY)

当我们在Makefile之外有一个已存在的文件clean和Makefile中的目标对象clean重复时,我们在用make clean 指定生成clean这个对象时,则不会生成:

那么怎么才可以生成Makefile中的clean,这时候就需要将其声明为:.PHONY:clean(将clean声明为伪对象),它的作用是:与外部的实际文件解除关系,表示这个对象无论如何都要被执行生成

 四、简单进度条小程序

 

 

对于上述程序printf("%-51s--[%d]\r",buf,i*100/50);这条语句,\r为回车符,意为让光标跑到行首,与\n不相同

在Linux中,一切东西都会被当做文件操作,打印其实是将数据交给显示器,然后显示器进行显示,向文件中写入数据,并不是直接将数据写入文件中,而是把数据放在缓冲区里边,等到缓冲区的数据满了或者刷新缓冲区的时候再把数据一次写入文件,当用\n和fflush进行操作时,不管缓冲区是否已满,都会刷新缓冲区。


http://chatgpt.dhexx.cn/article/Kbsdshcj.shtml

相关文章

linux 系统开发

4、Linux的安装(Windows环境下): 1)Windows环境需要借助虚拟机来安装Linux系统,这个推荐使用的软件是VMWare,官网能下载到的最新版本是Workstation Pro15.0,下载地址:https://my.vmw…

Linux基础开发工具

提示:本文内容较长,请参考左侧目录阅读 Linux基础开发工具 1.软件包管理器yum1.1 yum的基本操作1.2 关于lrzsz 2.Linux编辑器vim2.1 安装vimforcpp插件2.2 修改vim配置2.3 常见错误2.4 三种模式的转换关系2.5 正常模式指令移动光标删除文本复制替换撤销…

Linux应用开发自学之路

前言 在 「关于我 」那篇博文里,朋友们应该知道了我不是科班出身,是由机械强行转行到Linux应用开发方向。下面我就详细向大家介绍自己这一路上的转行历程,希望对大家有所启发。 我是学机械专业的,对于机械专业我还是很感兴趣&…

Linux的开发工具

文章目录 vim的介绍Linux编译器 gcc / g的使用动态库和静态库Linux调试工具 gdb的使用Linux项目自动化构建工具make 和 makefile进度条程序的编写 vim的介绍 什么是vim? 简而言之,vim就是一个文本编辑器,我们用来写代码的工具。 所以当最开始…

Linux开发工具

目录 一、yum工具 1.yum 背景知识 (1)商业生态 (2)开源生态 (3)软件生态本土化 2.yum 的基本使用 (1)查看软件包 (2)软件包名称构成 (3&a…

【linux】linux开发工具的使用

linux开发工具的使用 一、linux软件管家-yum1.1 软件包的概念1.2 yum的使用1.2.1 查看安装包1.2.2 安装软件1.2.3 卸载软件 二、linux下的编辑器-vim2.1 插入模式下的命令2.2 命令模式下的命令2.3 底行模式的命令2.4 vim的配置 三、linux下的编译器-gcc/g3.1 预处理3.2 编译3.3…

Linux系统:开发工具

开发工具 如 Visual Studio、IDEA 这样的集编写编译调试运行以及各种复杂功能于一身的开发工具,叫做集成开发环境 IDE。Linux 下一般使用代码编辑工具 vi/vim,编译工具 gcc/g,调试工具 gdb。 1. 编辑工具 vim vim,它是一款十分强…

Linux的开发流程

嵌入式linux开发流程 在嵌入式学习的过程中,嵌入式linux的学习是不可少的,可以说嵌入式linux是学习比较困难的,会遇到各种各样的问题,那么嵌入式linux学习有一个重要的点就是嵌入式linux开发的流程,这是必须要知道的&a…

Linux开发速记教程之第一篇

一、Linux职业方向 ①、服务器运维;②、应用软件开发;③、设备驱动开发。 二、设备驱动开发 Linux 系统的一个重要设计哲学是一切皆文件。包括硬件设备,对于系统来说也是一个文件,所以系统向上层应用程序提供 open、 write、 re…

Linux开发工具详解

目录 前言一.Linux编辑器-vim使用1.vim的基本概念2.vim命令模式命令集3.vim底行模式命令集4.简单的vim配置 二.Linux编译器-gcc/g使用1.背景知识2.gcc如何完成a.预处理(进行宏替换)b.编译(生成汇编)c.汇编(生成机器可识别代码)d.链接(生成可执行文件或库文件)e.重要概念f.动态链…

直接跳转与间接跳转

转载自: https://www.csdn.net/tags/MtjaIg1sNDE1MDYtYmxvZwO0O0OO0O0O.htmlhttps://www.csdn.net/tags/MtjaIg1sNDE1MDYtYmxvZwO0O0OO0O0O.html 正常执行的情况下,指令按照它们出现的顺序一条一条地执行。跳转(jmp)指令会导致执行切换到程序中一个全新的位置。 …

Vue路由跳转传参或打开新页面跳转

1. 通过路由中的name属性 使用params传递参数, 使用this.$route.params获取参数 这种方式传递相当于post请求, 传递的数据不会显示在url地址栏,但是页面刷新,参数会丢失 1 2 3 4 5 6 7 8 9 // 传递参数 this.$router.push({ name: "首页", params: { …

Nginx 跳转

目录 一.Nginx常见模块1.http2.server3.location 二.location1.一般分为普通和正则2.location 常用的匹配规则3.location 示例4.location优先级排列说明 三.REWRITE模块1.功能2.跳转场景3.跳转实现4.执行顺序5.语法格式6.实例6.1域名跳转6.2基于客户端IP 访问跳转6.3基于旧域名…

pyqt5的页面跳转

前言: 正在学习python,学到了文件读取操作,想用pyqt5实现一下,发现我对于pyqt5还是不够了解。 现在记录一下我用pyqt5实现页面跳转的过程 方便以后查阅 pycharm使用pyqt5的话建议解释器用python3.7 由于目前我的水平还是太菜&…

div链接跳转

1、先建立一个div 2、给div写个id,直接写个go吧,再写个class,就叫go1吧 3、给它里面写个你要跳转的网址名称 4、给它设置个样式,弄个黑色背景什么的 5、然后把字体调成白色,文字居中 6、这是目前这个div的样子 7、接着…

layui页面跳转

//模拟单页跳转 $(document).ready(function(){ $(“dd>a”).click(function (e) { e.preventDefault(); $("#iframeMain").attr(“src”,$(this).attr(“href”)); }); }); 逻辑:通过jq拿a的href值放到iframe的src属性上 解释: e.preventD…

html-超链接跳转-外部和内部页面跳转

a标签表示超链接 1、通过a标签来表示超链接,点击超链接文本可以跳转到绑定的网站地址 1表示外部的地址 2表示内部的页面的访问地址,不是填写内部页面,内部页面访问地址

AS页面跳转

在MyAdapter中定义如下接口,模拟ListView的OnItemClickListener: //define interface public static interface OnItemClickListener { void onItemClick(View view , int position); } 1 2 3 4 声明一个这个接口的变量: private OnItem…

页面跳转的两种方式(转发和重定向)区别详解:

转发和重定向的路径问题(重点) 1)使用相对路径在重定向和转发中没有区别 2)重定向和请求转发使用绝对路径时,根/路径代表了不同含义 重定向response.sendRedirect(“xxx”)是服务器向客户端发送一个请求头信息,由客户端再请求一次…

go语言web开发系列之八:gin框架中用go-redis缓存数据

一,安装需要用到的库 1,安装go-redis liuhongdiku:~$ go get -u github.com/go-redis/redis 说明:刘宏缔的go森林是一个专注golang的博客, 网站:https://blog.imgtouch.com 原文: go语言web开发系列之八:gin框架中用go-redis缓…