Linux系统(二)——Linux环境下的开发工具

2023-11-16

        接着上一篇博客,把Linux环境下常用的vim编辑器,gcc工具链,makefile和gdb等工具的使用理一理。

一、vim编辑器

1,工作模式

        vim是Linux常用文本编辑器。vim有两种基本工作模式:

        命令模式:输入的字符作为命令使用,不进入被编辑的文档中。

        编辑模式:输入的字符将修改文档的内容。

        在命令模式下,如果输入某些编辑命令(一般切换到插入位置在光标处的编辑模式键入i),则切换到编辑模式;编辑模式下,按Esc可以切换回命令模式。

 命令模式分为三种:普通模式,命令行模式和选择模式。

普通模式输入完毕就执行,不需要回车确定。普通模式下输入一个冒号则进入命令行模式

命令行模式:输入命令需按回车确认才执行,执行完毕后返回普通模式。

(1)普通模式下命令分为移动光标类,滚动屏幕类、编辑类等。

(a)移动光标类:

(b)滚动屏幕类:ctrl + F 向下滚动一屏   ctrl + B 向上滚动一屏   Ctrl + U 向上滚动半屏   ctrl + D 向下滚动半屏

(c)编辑类:

(d)文件类:ZZ存盘退出

 在普通模式下输入小写字母v进入选择模式,输入大写字母V进入按行选择模式,按Ctrl+V组合键进入按列选择模式

(2)命令行模式

:help  查看帮助首页     :0 移动到第一行    :¥移动到最后一行   :n  移动到第n行    :w保存文件  :q退出文件  :n 新建文件 :wq 保存并退出

二、gcc工具链

GNU/Linux系统上常用的编译工具是GCC。GCC实质上不是一个单独的程序,而是多个程序的集合,因此通常称为工具链。

  1、程序编译过程:

(a)预处理

在这一阶段,源码中所有的预处理语句得到处理,例如

#include语句所包含的文件内容替换掉语句本身

所有已定义的宏被展开

根据#ifdef #if等语句的条件是否成立取舍相应部分

gcc预处理阶段可以生成.i文件,通过选项-E可以使编辑器在预处理结束时停止编译。例如:

gcc -E -o  hello.i  hello.c

(2)编译

在这一阶段,编译器对源码进行语法分析,优化等操作,最后生成汇编代码。这是整个过程中最重要的一部。

可以通过选项-S使GCC在进行完编译后停止,生成.s的汇编程序。例如:

gcc -S -o hello.s hello.c   

(3)汇编

这一阶段使用汇编器对汇编代码进行处理,生成机器语言代码,保存为后缀为.o的目标文件中

当程序由多个代码文件构成时,每个文件都要进行汇编工作,生成.o目标文件后,才能进行下一步链接工作。

目标文件已经是最终程序的某一部分了,只是在链接之前还不能执行。可以通过-c选项生成目标文件:

gcc -c -o hello.o hello.c    

(4)链接

经过汇编后的机器码不能直接运行,为使操作系统能正确加载可执行文件,文件中必须包含固定格式的信息头。还必须与系统提供的启动代码链接起来才能正常运行,这些工作都由链接器来完成。

gcc -o hello hello.c   

2、gcc的基本用法

gcc [-Wall] [-O1..3] [-o name] file

-Wall:打开所有警告项

-O 设置优化级别, O0表示关闭优化功能

-g 将调试信息编译到目标文件中

-o name:指定输出文件的名字是name

file:被编译(链接)的文件。

使用举例:

三、make和makefile

 一个软件中通常包含很多文件,每次都进行编译会很麻烦而且效率低下。

在Windows平台上的VC、VB都有工程概念,一旦建立一个工程,这些开发平台会自动地维护其中的各种文件,从而高效编译。

在Linux中,使用make完成这一功能。

1、makefile文件说明

使用make工具,首先要编写makefile文件,一个makefile文件包含5个方面:

1、具体规则   2、隐含规则  3、定义变量    4、指令   5、注释 

2,makefile的规则:

诸如Autoconf和Automake的工具可以自动生成makefile文件。makefile的内容核心是一系列的规则。规则的基本格式是:

target:dependency

       (tab字符)command

(1)target(目标):通常是要产生的文件的名称

(2)dependency(依赖):指用来输入从而产生目标的文件。

(3)command(命令):是make执行的动作,一个规则可以有多条命令,每个命令一行。命令行首字符是TAB

3、makefile的实例:

(1)实例一:

objects = main.o mouse.o command.o display.o

CC = gcc

CFLAGS = -Wall -O2 -g               //相当于C中定义变量

game : $(objects)                         //定义game生成规则

             $(CC) -o edit $(objects)   

main.o : defs.h                             //定义main.o生成规则,包含隐含规则

mouse.o : defs.h command.h

command.o : defs.h command.h

display.o : defs.h buffer.h

.PHONY : clean

clean :                                          //定义clean的规则,无依赖

          $(RM) edit $(objects)  

  game的生成规则包含了规则的三个基本要素:目标、依赖、命令;main.o等规则没有命令,属于隐含规则(implicit rule)。clean规则没有依赖,不属于编译的内容,只是完成一个指定的动作。      

隐含规则能够告诉make使用传统的标准方法完成任务。例如,生成一个目标文件的方法是使用C编译器编译C语言源程序,这个步骤所用到的命令基本都是相同的。使用隐含规则就无须详细指定这些命令,而make能按照文件名的后缀的变化,决定所采用的规则。      

(2)实例二:

变量是makefile中定义的名字,用来代替一个文本中的字符串 ,该文本字符串称为该变量的值。Makefile中常见预定义变量有:

(a)CC  默认值cc(gcc)是C编译器的名称。

(b)CPP 默认是$(CC) -E 是C与预编译器的名称。

(c)CXX默认值是g++,是C++编译器的名称、

(d)RM 默认值 rm -f 是删除程序的名称。

(f)$@ 用在生成规则中,表示当前目标。

(g)$< 用在生成规则中,表示当前目标的第一个依赖目标。

(h)$^ 用在生成规则中,表示当前目标的所有依赖目标。

使用变量的方式:$(变量名)变量名只是字符时,()可省略

常用的变量赋值操作:

:= 直接赋值,信值覆盖原来的值。

?= 条件赋值,如果原来无值则赋值。否则保持原来的值。

+= 加法赋值,新值附加在原来值后面。

= 递归赋值,如果右侧包含其他变量,当这些变量的值变化时,被赋值变量的值也变化。

4,make的用法:

make 工具的基本用法如下:

make [-C dir] [-f file] [target]

-C dir:执行时进入dir目录,默认当前目录

-f file:使用file作为makefile

target:要完成的目标,目标在makefile中定义,默认是定义的第一个目标。

四、gdb调试工具

GDB是GNU的调试工具,它可以跟踪被调试的程序,进行设置断点、单步执行等操作。当程序暂停执行时,可以使用命令查看程序中的变量值、CPU的寄存器值、内存的值以及函数调用栈等信息。    

被调试的应用程序在编译时最好使用-g参数将调试信息编入目标文件中:

gcc -g app.c -o app

用以下命令启动对程序app的调试:

gdb app

如果程序app运行时需要参数,则用以下命令:

gdb --args app arg1 arg2  // arg1和arg2被视为app的参数,而不是gdb的参数   

启动后进入GDB交互界面,可以输入GDB的命令进行调试,常用命令如下(回车是重复上一条命令):

 

Shell进阶那一块看着有点复杂,不太容易搞定,需要再抽个时间仔细过一过了,今天就到这儿了,算是完成了今天的目标吧。总结一下今天:白天有点贪玩,浪费了一部分时间,以后尽量把娱乐时间安排在晚上9点以后。另一个方面是需要规划一下运动时间,今天只是在晚饭后在外面溜达了几圈,运动量太少了,需要加强!明天一天把C语言的所有语法过一遍,这些东西应该已经熟记于心了,再快速过一遍,查缺补漏,顺表敲一些常用的,简单的数据结构实例,为后天做准备。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux系统(二)——Linux环境下的开发工具 的相关文章

  • 操作系统第一章阶段性测试题——教材:计算机操作系统(第4版)汤小丹、汤子瀛

    操作系统 xff08 第一章 xff09 阶段性测试 一 单选题 xff08 15 题 xff0c 每题 4 分 xff0c 共 60 分 xff09 1 操作系统负责管理计算机系统的 xff08 C xff09 xff0c 其中包括处理机
  • Java面试必背八股文[12]:计算机操作系统

    进程和线程有什么区别 xff1f 进程 xff08 Process xff09 是系统进行资源分配和调度的基本单位 xff0c 线程 xff08 Thread xff09 是CPU调度和分派的基本单位 xff1b 线程依赖于进程而存在 xf
  • VMware下,私有云平台的配置(CentOS 7系统,含桌面)

    文章目录 实验环境 Windows系统 VMWare 15 1 0 CentOS 7 x86 64 Minimal 1810 iso映像文件 1 安装CentOS系统 2 实现远程桌面连接 实验环境 Windows系统 VMWare 15
  • CLI 命令行实用程序开发基础

    CLI 命令行实用程序开发基础 代码传送门 GoOnline平台 1 概述 CLI Command Line Interface 实用程序是Linux下应用开发的基础 正确的编写命令行程序让应用与操作系统融为一体 通过shell或scrip
  • 【Linux开发】编写属于你的第一个Linux内核模块

    曾经多少次想要在内核游荡 曾经多少次茫然不知方向 你不要再对着它迷惘 让我们指引你走向前方 内核编程常常看起来像是黑魔法 而在亚瑟 C 克拉克的眼中 它八成就是了 Linux内核和它的用户空间是大不相同的 抛开漫不经心 你必须小心翼翼 因为
  • 【计算机操作系统】第八章 网络操作系统

    1 计算机网络概述 ARPA 网 gt Internet 1 1 计算机网络的拓扑结构 1 2 计算机广域网络 计算机网络分为广域网和局域网两类 公用交换电话网 分组交换网 帧中继网 异步传输模式 ATM 1 3 计算机局域网络 基本局域网
  • 【计算机操作系统】第四章 存储器管理

    1 存储器的结构层次 1 1 多级存储结构 对于通用计算机而言 存储层次至少应具有三级 最高层为 CPU 寄存器 中间为主存 最底层是辅存 在较高档的计算机中 还可以根据具体的功能分工细划为寄存器 高速缓存 主存储器 磁盘缓存 固定磁盘 可
  • 计算机操作系统知识架构整理

    计算机操作系统 操作系统引论 操作系统的目标与应用 操作系统的目标 操作系统的作用 推动操作系统发展的主要动力 操作系统的发展过程 无操作系统的计算机系统 单道批处理系统 多道批处理系统 分时系统 实时系统 微机操作系统的发展 操作系统的基
  • 【计算机操作系统】第一章、操作系统引论

    参考书籍为汤老师经典教材 本博客旨在作为自己学习笔记并与大家分享 1 操作系统的目标和作用 1 1 目标 方便 有效 可扩充 开放性 1 2 作用 作为用户和计算机硬件系统之间的接口 用户可以通过1 命令方式2 系统调用方式3 图形 窗口方
  • Windows修改右键新建菜单【Win10、Win11版】

    目录 一 引言 二 方法一 三 成果展示 四 方法二 删除Shell New 五 方法三 借助shellNewSettings小工具 一 引言 有些混乱的windows桌面新建菜单 是不是让人很不舒服 比如下图 图中的Access需要新建么
  • 操作系统知识点总结(四)进程同步和临界区互斥问题

    一 进程同步的基本概念 临界资源 同步和互斥 在多道程序环境下 进程是并发执行的 不同进程之间存在着不同的相互制约关系 为了协调进程之间的相互制约关系 引入了进程同步的概念 临界资源 虽然多个进程可以共享系统中的各种资源 但其中许多资源一次
  • 计操理论课04 -- openEuler实验第三章进程管理

    文章目录 任务1 创建并运行内核线程 任务要求 任务代码 任务截图 任务2 打印输出当前系统 CPU 负载情况 任务要求 任务代码 任务截图 任务3 打印输出当前处于运行状态的进程的 PID 和名字 任务要求 任务代码 任务截图 任务4 使
  • 计算机操作系统之期末考试复习——进程的基本状态及转换

    进程的基本状态 就绪状态 Ready 进程已处于准备好运行的状态 即进程已分配到除CPU以外的所有必要资源后 只要获得CPU 便可立即执行 执行状态 Running 进程以获得CPU 其程序正在执行的状态 阻塞状态 Block 正在执行的进
  • 【计算机操作系统】第三章 处理机调度与死锁

    在多道程序环境下 主存中有着多个进程 其数目往往多于处理机数目 这就要求系统能按某种算法 动态地把处理机分配给就绪队列中的一个进程 使之执行 分配处理机的任务是由处理机调度程序完成的 由于处理机是最重要的计算机资源 提高处理机的利 用率及改
  • 计操理论课08 -- openEuler实验第七章文件系统

    文章目录 任务1 为 Ext4 文件系统添加扩展属性 25min 任务描述 任务过程及截图 任务2 注册一个自定义的文件系统类型 15min 任务描述 任务代码 任务截图 任务3 在 proc下创建目录 20min 任务描述 任务代码 任务
  • Linux系统(二)——Linux环境下的开发工具

    接着上一篇博客 把Linux环境下常用的vim编辑器 gcc工具链 makefile和gdb等工具的使用理一理 一 vim编辑器 1 工作模式 vim是Linux常用文本编辑器 vim有两种基本工作模式 命令模式 输入的字符作为命令使用 不
  • 【计算机操作系统】第二章 进程管理

    1 进程的基本概念 1 1 程序的顺序执行和特征 程序顺序执行时的特征 顺序性 处理机的操作严格按照程序所规定的顺序执行 即每一操作必须在上一个操作结束之后开始 封闭性 程序是在封闭的环境下执行的 即程序运行时独占全机资源 资源的状态 除初
  • 计算机操作系统实验三 进程间的通信

    一 实验目的 1 了解什么是管道 2 熟悉UNIX LINUX支持的管道通信方式 3 了解什么是消息 4 熟悉消息传送的机理 二 实验内容 1 编写程序实现进程的管道通信 用系统调用pipe 建立一管道 二个子进程P1和P2分别向管道各写一
  • 什么是多进程-多线程-多协程 ---- 文件系统

    Linux操作系统五大子系统 内核 操作系统的核心代码 进程调度 SCHED 调度算法 先进先出 短作业优先 最高优先级 内存管理 MM 虚拟内存 虚拟地址映射 段页机制 缺页中断 内存的分配管理 伙伴系统 操作系统之内存管理 知乎 文件系
  • 系统调用:用户级函数如何通过INT 80中断进入操作系统内核

    以printf 打印内核中的一段字符串为例 printf 是用户函数无法进入内核 因此需要进行系统调用 进入内核的方式是使用int 0x80中断 printf 函数想要进入系统内核是通过系统调用write 实现 位置 linux lib w

随机推荐

  • IDEA文件右键创建New没有Create New Servlet的解决办法

    Author codepig16 interesting wtsb7 1 问题描述 创建了一个Javaweb项目但是在src中右键创建中 没有Servlet选项 如下图所示 2 解决方案 解决方案分为三步 笔者本人是在第三步有问题 估计大部
  • Qt中左侧列表与右侧窗口关联

    左边列表选项与右边窗体关联 QListWidget list new QListWidget this list gt insertItem 0 tr Window1 list gt insertItem 1 tr Window2 QLab
  • C++ 多线程学习(二) 互斥锁std::mutex

    在多线程中经常会遇到多个线程同时修改同一个变量的情况 这个时候如果不对线程进行一定约束 很可能会导致意想不到的结果 例如有两个线程1和线程2 线程2的输入是线程1的结果 很显然如果在主线程中同时开启了线程1和线程2 它们是同时运行的 会直接
  • 华为机考108题(c++)(52-61)

    HJ52 计算字符串的编辑距离 描述 Levenshtein 距离 又称编辑距离 指的是两个字符串之间 由一个转换成另一个所需的最少编辑操作次数 许可的编辑操作包括将一个字符替换成另一个字符 插入一个字符 删除一个字符 编辑距离的算法是首先
  • 顺序表详解 —— 初始化、销毁、打印、增加、删除、查找、修改

    文章目录 顺序表介绍 初始化顺序表 销毁顺序表 打印顺序表 增加数据 头插 尾插 指定下标位置插入 删除数据 头删 尾删 指定下标位置删除 查找数据 修改数据 顺序表介绍 顺序表是在计算机内存中以数组的形式保存的线性表 线性表的顺序存储是指
  • Spark基础知识(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 一 Spark概述 Spark模块 Core SQL Streami
  • js字符串转数字

    1 通过Number 函数传入一个合法的字符串参数 可以把字符串转换成一个十进制整数 十进制字符串可以带小数 其它进制我试过都不能有小数 否则返回NaN 11 其实也是调用的Number 11 进行减 乘 除运算时 字符串的自动转换也是调用
  • Redis数据类型常用命令

    Redis数据类型常用命令 Redis Key String 字符串 List 列表 Set 集合 Hash 哈希 Zset 有序集合 三种特殊数据类型 Geospatial地理位置 Hyperloglog 基数 Bitmap 位图 位存储
  • R语言-ggplot2柱状堆叠图

    导入数据 load D R futures user 2 dat 提取需要画图的数据 a futures user 2 c 1 2 5 对部分错误的数据进行修改 a province which a province 广西桂林 lt 广西
  • Node 16版本和 node-sass 兼容性问题

    我电脑上的node版本是16 13 1 运行刚克隆下来的项目时 npm install 报错 gyp err 百度之后确定是node sass版本兼容性问题 项目的package json文件版本如下 devDependencies nod
  • str.charAt(i);的作用

    在java中 有 String str leetcode 则 str charAt 0 为 l str charAt 1 为 e str charAt 2 为 e
  • 拉格朗日插值

    直接上公式 简单的讲 这个玩意就是在给你若干个 f xi yi 的结果 算出f k 的结果 最朴素的实现方法 验证下这个公式的结果 include
  • 【利用Python module计算程序运算时间】

    本文简介如何利用Python module来计算程序运算时间 内容概览 为什么要计算程序的运行时间 方法一 time module 方法二 timeit module 为什么要计算程序的运行时间 编写程序时 为了比较各种算法或优化算法 需要
  • Typescript 装饰器和反射

    装饰器 装饰器 也叫注解 对一个类 方法 属性 参数的装饰 它是对这一系列代码的增强 并且通过自身描述了被装饰的代码可能存在行为改变 装饰器是一种特殊类型的声明 它能够被附加到类声明 方法 访问符 属性或参数上 装饰器使用 expressi
  • 一篇博文教你SpringMVC中JSON注解&异常处理的使用

    目录 一 JSON数据返回 1 2 Jackson的介绍 1 3 3 案例演示 二 异常处理 2 4 1 异常处理方式 2 4 2 异常处理方式 2 4 3 异常处理方式 一 JSON数据返回 1 1 1 2 Jackson的介绍 1 2
  • steam创客教育

    社会竞争日益激烈 为了让子女将来能 成龙成凤 父母们都非常重视孩子的教育 格物斯坦小坦克看到这样普遍的现象 为了让自己的孩子不输在起跑线上 在各种各样兴趣班盛行的当下 很多家长常常盲目跟风 看到别的孩子学着还不错或升学考试需要 也给自己孩子
  • oracle中sqlload,oracle----sqlldr用法(转)

    SQL LOADER是ORACLE的数据加载工具 通常用来将操作系统文件迁移到ORACLE数据库中 SQL LOADER是大型数据 仓库选择使用的加载方法 因为它提供了最快速的途径 DIRECT PARALLEL 现在 我们抛开其理论不谈
  • elasticsearch 2.3.4 java API 连接,ik分词器,设置集群节点,创建index,mapping的几种方式...

    1 默认集群连接 Client client TransportClient builder build addTransportAddress new InetSocketTransportAddress InetAddress getB
  • mybatis的熟练运用以及反射知识讲解

    JSP常用设计模式MVC模式 Mybatis mybatis的使用 我们在写项目的时候必定要写DAO 写DAO的时候不难发现对每张表的DAO都差不多 只是sql语句不同 DAO中的每个方法其实也差不多 所以直接用JDBC写DAO是在太麻烦
  • Linux系统(二)——Linux环境下的开发工具

    接着上一篇博客 把Linux环境下常用的vim编辑器 gcc工具链 makefile和gdb等工具的使用理一理 一 vim编辑器 1 工作模式 vim是Linux常用文本编辑器 vim有两种基本工作模式 命令模式 输入的字符作为命令使用 不