垫江网站建设djrckj自己做发小说网站

当前位置: 首页 > news >正文

垫江网站建设djrckj,自己做发小说网站,云龙网站开发,网站后台口令目录 1、Linux软件包管理器yum 1.1 什么是软件包 1.2 安装软件 1.3 查看软件包 1.4 卸载软件 2、Linux编辑器-vim 2.1 vim的概念 2.2 vim的基本操作 2.3 vim的配置 3、Linux编译器-gcc/g 3.1 gcc编译的过程​编辑​编辑​编辑 3.2 详解链接 动态链接 静态链接 4…目录 1、Linux软件包管理器yum 1.1 什么是软件包 1.2 安装软件 1.3 查看软件包 1.4 卸载软件 2、Linux编辑器-vim 2.1 vim的概念 2.2 vim的基本操作 2.3 vim的配置 3、Linux编译器-gcc/g 3.1 gcc编译的过程​编辑​编辑​编辑 3.2 详解链接 动态链接 静态链接 4、Linux项目自动化构建工具-make/makefile 4.1 make/makefile的使用 4.2 依赖关系与依赖方法 4.3 .PHONY 4.4 make的自动推导 4.5 多文件编译 5、小程序 5.1 回车换行 5.2 缓冲区 5.3 倒计时小程序 5.4 进度条小程序 6、git 6.1 版本控制 6.2 创建仓库 Linux Windows 7、Linux调试器-gdb 7.1 debug与release 7.2 调试命令 7.3 cgdb 7.4 条件断点 1、Linux软件包管理器yum Linux中常见的软件安装方式 a. yum/apt b. .rpm安装包安装 c. 源码安装 Linux的软件生态 评价一款操作系统好不好除了要看操作系统本身还要看操作系统好不好获取、操作系统是否有活跃的社区、论坛、操作系统在官方中是否有完善的文档说明、操作系统的用户是那些这一套称为软件生态 1.1 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。软件包和软件包管理器, 就好比 App 和 应用商店 这样的关系。yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat, Centos等发行版上。 所以简单来说软件包就是一个编译好的可执行程序。 1.2 安装软件 安装软件需要是root也可sudo因为安装软件通常是安装到/usr/bin目录下这个目录的拥有者、所属组均为root并且对于other没有写的权限 通常安装就是yun install -y …install是下载将软件包下载并安装的效果不加-y是会在下载完被询问是否需要安装 1.3 查看软件包 可以使用yum list将所有已安装和可安装的软件包罗列出来 会出现3列第一列是软件包的名称第二列是版本号el7就是在CentOS7下使用第三列是yum源的来历。 也可以使用管道来查看与某一关键词相关的软件包 1.4 卸载软件 可以使用yum remove -y …来卸载软件-y与install中含义相同 我们这里以lrzsz这个软件包为例这个软件包是用于windows和Linux两种操作系统之间文件的传递的sz将Linux中的文件传入windows中拖拽将windows中的文件传入Linux中 若一个安装包已经安装再install是不会做任何事情的此时可以使用sz向windows传文件 将这个软件卸载后就无法再使用sz了 再下载回来就可以正常使用了 此时会有一个问题云服务器有那么多yum install为什么就能知道去那一台云服务器上找到对应的软件包呢实际上yum是有对应的配置文件的配置文件中就记录了软件包对应的yum源yum会根据这些yum源将自己的系统版本替换再根据系统路径形成一条下载链接,然后yum会去调用一些工具通过下载链接下载下来。配置文件在/etc/yum.repos.d/中,一般看CentOS-Base.repo 可以使用vim来查看配置文件中的内容 若要配置yum源首先要下载一个国内的yum源然后替换掉/etc/yum.repos.d/中的一般替换掉CentOS-Base.repo注意在替换掉之前需要先将下载下来的yum源改名为CentOS-Base.repo。配置后yum源就不是CentOS7的而是配置的 2、Linux编辑器-vim 2.1 vim的概念 在之前我们使用vs2022时vs2022可以完成代码的编辑、编译、调试、运行等称为集成开发环境而vim仅仅只能完成代码的编辑。 vim有多种模式这里主要介绍3种模式 1命令模式 一打开vim就是命令模式在命令模式下只能输入命令输入其他的无效 2插入模式 此时可以随机编辑内容 3底行模式 在文档内的最底行输入指令 2.2 vim的基本操作 使用vim打开一个普通文件就行编辑 13种模式的互相切换 在底行模式下输入set nu/set number可调出行号 2光标所在行 a. 复制yyn yy可以复制多行 b. 粘贴pn p c. 撤销u d. 剪切ddn dd剪切也可用于删除 3光标快速定位 a. shift g G定位到文本的最末尾 b. gg定位到文本的最开始 c. n shift g n G定位到文本的第n行 d. 光标局部定位可以使用上下左右也可以使用HJKLH左J下K上L右 4每一行操作 a. shift 4 \(到行尾 b. shift 6 ^到行首行尾和行首也称为锚点 c. w以单词为单位向后跳转 d. b以单词为单位向前跳转 5局部删除编辑 a. x光标位置向后逐字节删除n x b. shift x X光标位置向前逐字节删除n shift x 注意光标向后删除会删除掉光标所在位置的字符光标向前删除是删除光标前一个 c. shift ~大小写快速切换一直按住可以快速向后移动 d. n r 字符将原本的字符替换为输入的字符 e. ctrl r R撤销刚刚的撤销可以与u相抵消 使用nr字符来替换字符是比较麻烦的因为替换完1个字符后要手动向后移动可以使用shiftrR来进入替换模式按Esc回到命令模式 在底行模式下可以输入一些字符来进行在文本中查找按n可跳转到下一处 插入模式、底行模式这两个模式是无法直接切换的需要先切换到命令模式再切换。因为在插入模式中所有输入都回被当成普通字符。如何模式都可有命令模式进入。 进入插入模式有3种方式aioa是光标向后移动一位i是光标不动o是光标向下新开一行 底行模式下set/nu/number是加行号set nonu是取消行号w是保存q是退出w!是强制写入q!是强制退出wqwq! 可在vim的底行模式下输入! Linux中的指令来对vim的外部进行操作按回车技能回到vim中 这个的真正作用是在不关闭vim的前提下对vim打开的文件进行编译 当然也可以在vim里面运行这里是退出vim再运行 可以使用vs来打开文件此时会分屏此时窗口可能有多个但是光标只有一个 ctrl w将光标移动到下一个窗口不断按w就可一直切换到想要的窗口 此时可将一个窗口的内容复制到另一个窗口 此时使用wq是关闭光标所在的窗口 shift zz ZZ相当于wq但是用wq不建议使用shift zz 如果我们想对代码进行注释可以手动一行一行//但是这样效率太低 此时可以使用ctrl v进入视图模式可以进行批量化注释 步骤是ctrlv - HJKL进行区域选择 - shiftiI进入插入模式 - 注释选择区域的第一行 - Esc 这里不建议使用上下键 这里也不仅可以加注释其他批量操作都可以| 到末尾全注释ctrlv - shift g - shiftiI进入插入模式 - 注释选择区域的第一行 - Esc 注释到第n行ctrlv - n shift g - shiftiI进入插入模式 - 注释选择区域的第一行 - Esc 取消注释ctrl - HJKL进行区域选择 - d 我们可以更新上面模式切换的图片 2.3 vim的配置 在用户目录下会有一些隐藏配置每用vim打开文件会在该用户的家目录下查找名为.vimrc的配置文件没有则创建一个在.vimrc中编辑即可配置vim 我们现在要配置vim使之能够更方便地写代码所以创建一个.vimrc来配置vim 我们随意向.vimrc中写入一条指令看看效果 此时向.vimrc中写入了一条设置行号的指令再用vim打开文件里面就自动加了行号 我们现在是给普通用户cxf设置了vim使用root或其他普通用户打开vim时是不会读取cxf的.vimrc的即使进入了cxf的家目录。vim启动时会读取当前用户家目录下的配置文件给自己配置了只会影响自己 我们前面有提到过sudo这个指令是给普通用户提权的指令实际上就是在/etc/sudoers这个配置文件中操作此时需要切换为root 复制第一句然后修改名字即可后面不需要变要wq!因为这个文件对于root的权限也只有读 此时就可以使用sudo来进行提权操作了 现在创建文件就有3种方式了touch、、vim打开一个不存在的文件是否往里面写入内容都行只要最后有保存 3、Linux编译器-gcc/g 前面我们在vim中编写了代码若想要对代码进行编译并生成可执行文件就需要使用gcc 3.1 gcc编译的过程 实际上gcc在将源文件(.c)编译成可执行文件的过程中有4步操作分别是预处理、编译、编译、链接可以通过gcc的选项来观察这4步 1、预处理进行宏替换 2、编译生成汇编 3、汇编生成机器可识别的二进制代码 汇编完成的文件(.o)称为可重定位目标文件 会发现code.o不可执行即使加上了可执行权限仍然不可执行这是因为code.o本身不可执行 4、链接生成可执行文件或库文件 3.2 详解链接 可以使用ldd可执行程序来查看这个可执行程序来链接时链接了那些库| code这个可执行程序在链接时链接了3个库其中第一、三个库基本上所有程序都会有。从第二个库中可以看出code依赖的是c标准库因为我们是使用c语言写的code.c 会发现ls指令也是用c语言写的实际上很多指令都是用c语言写的 上面以.so结尾的是动态库再后面的是版本号 讨论一个问题是先有编译器还是先有语言 先有编译器。最先开始计算机只有二进制这时候是不需要编译器的直到有了汇编时才有了编译器的需求是先用二进制写一个汇编的编译器将汇编代码翻译成二进制这样才能够让汇编语言跑起来否则语言无法编译。 讨论另一个问题为什么要将高级语言变成汇编再变成二进制呢而不是直接从高级语言翻译成二进制呢 可以。但是成本太高并且历史也不是这么发展的。 C语言头文件在/usr/include下 随便打开一个头文件会发现里面就是大量函数的声明这些函数的实现在库文件libc-2.17.so中链接实际上就是根据头文件中的声明去库文件找对应的函数的过程。 链接方式有动态链接和静态链接两种 动态链接 动态链接需要用到动态库.so(linux)、.dll(windows) 链接时编译器会告诉可执行程序库函数要用到的动态库和地址当调用到库函数时就到动态库的这个地址找执行到需要库的方法时跳转到动态库执行完再返回继续向后执行这个过程称为跳转 动态链接的优势是所有人共享一个库比较节省资源可执行程序体积较小 动态链接的劣势是一旦动态库缺失所有程序都将无法执行并且跳转较为浪费时间 静态链接 静态链接需要用到静态库.a(linux)、.lib(windows) 静态链接就是当我们需要用到某一个库函数时去静态库中拷贝一个库函数到我们的可执行程序中 静态链接的优势是不依赖其他库库丢失也无所谓 静态链接的劣势是比较浪费资源可执行程序的体积比较大 我们使用gcc生成的可执行程序默认是动态链接 可以使用file文件来查看一个文件的文件类型 可以发现刚刚的code就是使用动态链接的方式生成的 另外通过ldd也可以看到链接的库是.so是动态库也可证明是动态链接的方式生成的 若想要使用静态链接的方式生成一个可执行程序需要先安装C/C的静态库 静态库在/lib64/libc.a中 4、Linux项目自动化构建工具-make/makefile 4.1 make/makefile的使用 当我们要对写好的代码进行编译时可以使用gcc来编译也可是使用make/makefile来编译其中make是一个指令而makefile是一个文件makefile首字母也可以大写。 会发现我们将makefile完成后调用make即可生成可执行程序。当我们调用make时会去寻找当前目录下的makefile并执行里面的内容。 当我们要删除一个可执行程序时可以使用rm也可以使用make/makefile 4.2 依赖关系与依赖方法 在上面我们的makefile中实际上是写了两组依赖关系以及对应的依赖方法 依赖关系的下一行必须是依赖方法并且依赖方法的前面一定要有一个Tab .PHONY的后面跟的是伪目标文件。这里的clean就是伪目标文件注意,并不是一定要取名为cleanmakefile文件会被make从上到下扫描第一个目标名是缺省形成的如果想要执行其他组的依赖关系和依赖方法make namemake name就是生成一个名字为name的目标文件当我们调用make时能够形成一个proc的可执行程序是因为这时makefile从上到下扫描到的第一组依赖关系。而调用make clean时就是要让其形成一个名称为clean的文件此时就会去makefile中查找目标文件是clean的依赖关系并执行其依赖方法 若将两组依赖关系的顺序兑换调用方式也需要兑换 我们更加习惯于将清理放在最后面 实际上依赖方法就是一条命令可写任何命令也可执行多条命令 makefile中的注释使用# 我们会发现依赖方法执行时会将依赖方法和结果同时输出。可以在依赖方法前加让其只输出结果不输出依赖方法若makefile中的gcc有错则makefile中执行到gcc那一步就不会再向下执行了终止推导程序 编译好后还可以将可执行程序重命名之类的因为可以跟多条依赖方法 4.3 .PHONY 我们此时可能会有疑问.PHONY的用处是什么 我们先来看看make的一个特性 会发现当已经有了可执行程序并且没修改程序代码再make会提示当前可执行程序是最新的并且不会再重新生成一个可执行程序。若修改了proc.c中的内容即使有可执行的proc也会重新编译生成一个 clean有.PHONY时 clean没有.PHONY时 会发现clean无论有没有被.PHONY修饰都是一样的可以一直make clean 我们在上面看到了没有被.PHONY修饰的proc现在来看看使用.PHONY修饰后的proc有什么不同 会发现使用.PHONY修饰proc后就可以一直make了 此时会有两点疑问 1.PHONY是如何做到的 2为什么无论有没有.PHONY修饰clean没有变化而.PHONY修饰proc后有明显区别 我们首先来看第一个问题 使用stat可以查看一个文件的属性 任何文件都有3个时间 Access文件最近被访问的时间 Modify文件内容最近被修改的时间 Change文件属性最近被修改的时间 注意对属性修改内容不会变但是对内容修改属性可能会变如往文件中写入了内容可能会导致文件的大小变大 Access时间相较于另外两个时间并不是重点但这里要对Access时间强调一点不一定会随着访问而变化因为在Linux中访问文件的次数是远大于另外两个之和的cat一下也是访问文件若每访问一次就会修改一下Access(文件是放在磁盘上的)这样操作系统就会与磁盘进行频繁的IO交互影响效率。所以Access不是每一次访问都会刷新而是积累一定次数才刷新 Modify也是创建时间 make是否需要重新编译看的就是可执行程序与其对应的源文件的Modify源文件的Modify若小于可执行程序的Modify则不会重新编译若大于则重新编译不会出现等于的因为必须是先有源文件才能有可执行程序 所以问题1的答案就是。.PHONY会让依赖方法忽略掉时间对比一直执行依赖方法。 接下来看问题2 proc调用的依赖方法是gcc是会生成可执行程序的这样就有了可执行程序和源文件可以进行时间对比。但是clean的依赖方法是rm不会生成文件并且rm本身也不关心时间 这里建议clean时带上.PHONY因为rm不关心时间但是clean后面可能不止一条依赖方法有些依赖方法可能关心时间若因为其他关心时间的方法导致rm没有执行则可能出错 touch -m 文件可以修改文件被修改的时间到当前时间 4.4 make的自动推导 此时直接make要生成的文件是procproc的依赖文件是proc.o会发现当前目录下并没有(依赖关系不存在无法执行依赖方法)所以要先去生成proc.o所以寻找proc.o作为目标文件的依赖关系发现依赖文件是proc.s仍然没有继续向下直到找到存在的依赖文件。 实际上输入make指令后要读makefile文件会有一个栈的结构当依赖关系不存在时就将依赖方法入栈直到找到依赖关系存在的就出栈并执行命令总结make解释makefile时会自动推导。一直推导不执行依赖方法。直到推导到有依赖文件存在然后逆向地执行所有的依赖方法。 通常不会像上面一样写的那么详细而是会先用.c生成.o再用.o生成可执行程序windows下运行一个文件除了生成可执行文件外通常还会生成一个.obj文件就是这里的.o文件 4.5 多文件编译 我们现在来使用另一种写法完成与上面那幅图相同的功能 %.o形成与.c同名的.o文件 %.c当前目录下所有的.c文件展开到依赖列表中 \)将右侧的依赖文件一个一个地交给gcc -c选项形成同名的.o文件 上面proc的依赖列表中只有proc.o一个文件所以只会形成一个.o文件若proc的依赖列表中有多个.o文件并且当前目录下也有足够的.c文件则会同时生成多个.o文件 还可以更进一步地使用通配符 这里的src可能是一个依赖列表 \(^所有的依赖文件列表 \)目标文件 现在我们想要修改可执行程序的名称直接修改bin右边的值即可 为了简便我们现在不生成.o文件 我们现在要一次make将这两个.c文件都生成可执行程序 会发现只生成了一个可执行程序这是为什么呢因为在makefile中只要形成了一个可执行程序后makefile就不再执行。也就是说make默认只形成一个可执行程序 若想要一次形成多个可执行程序可以定义一个伪目标 为什么定义一个为目标就行了呢 因为伪目标all依赖于bin1、bin2此时makefile从上往下扫描时就会认为自己需要形成的是allall依赖于bin1、bin2就会向下寻找生成bin1、bin2的依赖关系从而生成bin1、bin2生成bin1、bin2后all并没有依赖方法所以直接结束 5、小程序 我们结合前面所学习到的知识点来完成两个小程序倒计时和进度条要完成这两个小程序首先需要了解两个小知识回车换行、缓冲区 5.1 回车换行 回车(\r)是让光标回到所在行的最前面 换行(\n)是让光标到下一行的相同位置 在计算机中按回车键实际上是回车换行即\r\n 输入\r是只回车。C/C对\n进行了特殊处理使其功能为\r\n 5.2 缓冲区 我们先通过一个程序来见一见缓冲区 sleep是让程序休眠的函数sleep(n)让程序休眠n秒 此时成功生成了可执行程序执行可执行程序时先打印出了hello world过了两秒程序才结束 我们现在修改一下程序将换行去掉看看有什么区别 此时也能打印出hello world但是是程序运行2秒后才打印的并且打印完立刻结束。在C语言中一个函数是从上往下执行的所以printf一定比sleep先执行为什么printf执行后没看见输出的字符串呢在执行sleep的2秒内这个字符串在哪里呢 实际上在执行sleep的2秒内字符串在缓冲区中。当printf的末尾有\n时强制刷新了缓冲区将缓冲区内的内容输出了出来而printf末尾没有\n时不会刷新缓冲区缓冲区内的内容就一直放在缓冲区直到程序中有刷新缓冲区的内容被执行或程序结束才会被输出。 程序编译好变成二进制后是要加载到内存的程序是被CPU执行的CPU无法直接将字符串显示到显示器上所以程序会在内存上对显示器开一段空间这个空间就是缓冲区将字符串从内存拷贝到内存。若这个字符串有\n则立刻被刷新若这个字符串没有\n则在缓冲区暂存直到缓冲区被写码或碰到\n才输出 若想让没有带\n的字符也立刻输出可以使用fflush函数刷新文件流 文件输出时C语言有3个输出流可以使用man stdin查看 显示时与输出有关的时stdout缓冲区就在stdout指针指向的FILE对象中 此时除了字符串没有换行都与有换行时的效果相同 5.3 倒计时小程序 有了前面的铺垫现在来写一个倒计时小程序 先来完成一个从9减到0的倒计时小程序 这样是不好的因为每输出一个数会换行 我们想要的效果是每次只输出一个数字下一个数字会覆盖掉上一个数字最后0保留 此时好像可以将\n换成\r但是换成/r后什么都没显示为什么呢 因为没有换行也就没有刷新不会输出并且每次写入缓冲区后都有\r下次在写入缓冲区会将上一次写入缓冲区的覆盖掉。最后while结束时缓冲区只有1个0等到程序结束这个0才会被输出但是注意此时缓冲区的光标是在0前面的因为printf输出0后又立马执行了\r让光标回退到0的前面。所以程序结束后输出0因为缓冲区中光标是在0前面的所以Xshell的命令行直接将0覆盖了看起来的效果就是什么都没输出。前面printf(hello world)没有换行最后能够输出并且Xshell命令行在其后面是因为printf向缓冲区写入hello world后光标是在d的后面Xshell命令就是从光标开始写的。 此时可以在最后面加一个换行来查看是否有输出0 前面是什么都没有的只在结束时才输出了一个0。在执行完while后与上面是一样的缓冲区中只有1个0并且光标在0的前面执行换行后清空缓冲区将0输出了出来并让缓冲区的光标移动到了下一行这样Xshell的命令行就会在下一行打印从而不会覆盖掉0 我们在printf后面加一个fflush让其实时刷新就可以看到倒计时的效果了 此时前面是有倒计时的只不过结束时0被覆盖掉了我们可以在最后面加一个换行防止0被覆盖 注意我们使用fflush刷新了缓冲区但是缓冲区的光标是不会有变化的若想要缓冲区的光标在不加入东西时有变化只能使用\r或\n 像这里我们向缓冲区中写入东西后不回车即使刷新了缓冲区将缓冲区的内容输出了但是光标还是一直正常向后移动的所以结构是9876543210 我们现在完成了从9向下的倒计时小程序9到0位数都是相同的我们看看我们的程序从10到0的倒计时此时有位数变化 此时会发现程序的运行结果是不正常的。类型的概念只有语言上有显示器上就是一个一个的字符。printf是格式化输出格式化输出的意思就是将输出的东西都当成一个一个的字符。因为10是两个字符放到缓冲区后回退到1的前面后面的数字都只有1个字符只会覆盖掉10的第1个字符0永远不会被覆盖也就一直保留着。 此时可以使用%2d来输出让每个字符输出时都占2个字符位默认是右对齐而我们想要的是左对齐可以使用%-2d 此时就正常了 5.4 进度条小程序 我们现在要实现一个进度条小程序这个进度条要预先开好100个字符的空间进度条程序运行的过程中根据进度从左向右填入#右边要有进度条进度的百分比并且还要有|/-\的旋转光标 此次使用3个文件来完成进度条小程序代码的编写先来完成进度条主体的编写 此时是不理想的因为进度条应该是在一行的并且此时也没有预留出100个空位 这里循环是进行了101次循环结束后bar数组中也确实有101个字符下标从0到100但是最终输出的字符串只会有100个字符因为bar[100]#放入后并没有输出 此时效果并不是我们想要的需要在最后面加上一个回车换行 实际上是需要回车换行的但是C/C中的换行经过了特殊处理所以只回车即可 此时就是我们想要的了 完善进度条 我们现在在进度条后面加上百分比和旋转光标 此时就完成了 真正的进度条 上面我们实现的进度条实际上只是呈现了一个进度条的效果函数一调用直接从0到100没办法与下载、加载等关联起来所以我们现在要来实现一个能够与下载、加载等关联起来的进度条。此时不与上面一样使用旋转光标而是采用5个. 我们可以在main.c中模拟一个下载程序这里使用随机数主要是为了模拟网络波动 我们这里规定的是每前进百分之1的进度就添加一个#如果想每前进百分之2进度添加一个#可以将for循环中的i改成i2 这里为了能够在for中定义变量i需要gcc加上-stdc99因为这是C99标准才允许的 现在运行这个程序是会有关于usleep的警告但是没关系仍然可以正常生成可执行程序 现在在进度条后面加上几个点这样当下载很缓慢但是仍然有在下载是能够通过此判断程序仍然在运行 这里需要给进度条后面的百分比预留一个位置因为100%和99%的位数是不同的增加到100%时若是突然向后一位会覆盖到一个. 此时是有问题的 现在只有最先开始会从1个点到5个点点满了之后没有更新。这种情况就是因为满了5个点后假设整个进度条的长度是125现在又回到了120个字符后面5个字符仍然在哪里实际上更新了但是看起来是没有更新的此时可以在任何情况下都输出125个字符 此时就正常了 我们可以像下面这样子让current一直不变进度条就一直不动但是5个.就会一直变化 我们可以将download的参数写成一个函数指针这样只要下载规则一样进度条类似的可以应用与多个函数 6、git 6.1 版本控制 git可以用来进行版本控制。git是一个软件可以使用git在云服务器上建一个代码仓库再将其克隆到本地这样就可对本地的数据与服务器上的数据进行同步。gitee和github都是基于git搭建的网站。 版本管理是在本地进行的然后将其同步到远端仓库上去。 6.2 创建仓库 我们现在在gitee上创建一个代码仓库然后将其分别克隆到windows和linux下也就是在windows和linux下都与这个远端仓库进行关联 一定要初始化仓库 Readme文件是让文档拥有说明。Issue模板文件和Pull Request模板文件均与多人协作有关。 创建出来后仓库里面就有了3个文件README.en.md和README.md均为说明文档 Linux 复制这个链接然后在linux下使用git clone 链接即可将远端仓库克隆到本地 详细看一下本地仓库中都有一些什么里面主要就是一个目录和普通文件 我们现在已经将远端仓库克隆到本地仓库了现在试着通过本地仓库像远端仓库传入文件此时需要3步操作也称为三板斧 我们现在在目录test_git下创建了一个代码文件注意此时并没有将其放到本地仓库更不用说将其传输到远端仓库了本地仓库是test_git里面的.git 我们此时可以使用git status来查看当前的仓库与远端仓库是否有变化 发现会提示多了一个test.c并且提示可以使用git add 文件 现在正式来将文件传输到代码仓库 git add git add后文件就放到了.git的暂存区中也就是.git里面的index 此时再git status会提示若想放弃提交可以使用git reset HEAD 文件将文件清除出暂存区 git commit git commit是将文件从本地仓库的暂存区转存到本地仓库的objects中此时才能算真正的将文件上传到了本地仓库并且上传成功时都会生成一个文件id可以通过这个文件id到.git的objects目录下找到文件的提交记录 提交信息会被保存在.git的logs中可以通过git logs来查看提交信息 git push 再使用git push并输入gitee的账号和密码即可将本地仓库与远端仓库进行同步此时就能将本地仓库多出来的文件上传到远端仓库了 可以看到此时远端仓库上就有了test.c 若上传时想忽略掉某些文件可将后缀放到,gitignore中 .gitignore中就是一些后缀上传这些文件时会自动忽略 Windows 在终端输入与linux下一样的命令即可将远端仓库克隆到本地 这里上传操作与linux下类似就不过多赘述了 我们现在在windows下向远端仓库上传一个文件 此时远端仓库就有了这个文件了 我们现在试一下再使用linux提交 会发现此时提交失败了这是为什么呢 因为远端仓库与linux的本地仓库不同步。我们在windows下上传了一个文件到远端仓库导致远端仓库比linux下的本地仓库多了一个文件。而当远端仓库与本地仓库不同步时是不允许从本地仓库往远端仓库上传文件的。 此时我们可以使用git pull来拉取远端仓库的内容 拉取后会发现当前目录下就多了一个从windows上传的test.cpp此时再git pull上传即可成功 在windows下同样也可以使用git pull来拉取远端仓库的内容 假设我们现在在windows下和linux下对远端仓库中的同一份代码进行了修改windows先提交linux后提交linux肯定会提交失败我们现在要看一下在linux下git pull后文件会有什么变化 我们对code.c文件进行修改 提交失败后我们进行了pull git pull后会将windows和linux的修改拼接在一起会有一些特殊字符需要程序员自己修改自己来拼接两部分 修改好code.c后push上传若windows要再上传仍然需要再pull一次 7、Linux调试器-gdb 7.1 debug与release 要进行调试发布版本一定要是debugrelease版本再编译时会取消调试信息而debug会添加调试信息。gcc/g编译形成的可执行程序默认是release的若想要生成debug版本需要加-g选项 我们写一个程序来进行验证 我们会发现myexe-debug的大小比myexe大这是因为myexe-debug中添加了调试信息。我们还可以使用readelf来读取可执行程序中的管理信息。 会发现myexe中没有与debug相关的字段而myexe-debug中有。这些含义debug字段的就是调试信息。 7.2 调试命令 listl 行号显示binFile源代码接着上次的位置往下列每次列10行。 listl 函数名列出某个函数的源代码。 r或run运行程序。 n 或 next单条执行。 s或step进入函数调用 break(b) 行号在某一行设置断点 break 函数名在某个函数开头设置断点 info break 查看断点信息。 finish执行到当前函数返回然后挺下来等待命令 print(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)查看各级函数调用及参数infoi) locals查看当前栈帧局部变量的值 quit退出gdb 接下来就逐个看这些命令 l命令 r命令 直接让程序跑完类似于vs中的F5 b命令 类似于vs中的F9 可以看到每一个断点信息的最前面都有一个Num称为断点编号 给函数打断点时是在函数的第一行打上断点像上面的Sum在第3行但实际上会打到第5行 c命令 从1个断点跳转到下一个断点 d命令 我们此时将1、2、3号断点都删掉再打上新的断点会发现新的断点的断点编号是从4开始的。在一个调试周期下断点编号是线性递增的。 打上断点后执行r程序就会停在断点处可以使用info b来查看断点被命中的次数 可以使用enable或disable 断点编号来启用或禁用断点 disable禁用断点后断点还在只是程序运行时并不会停下来 n命令 n命令是单行执行类似于vs中的F10是逐过程遇到函数并不会进去 当我们使用r来运行程序遇到断点停下后再按r不会向后走而是会被提问是否需要重新启动此时可以使用n来运行下一步。并且执行一次n后若想再继续向后走可以什么都不输入直接回车这也是前面的gdb会记录最新的一条命令。 s命令 s命令是单行执行类似于vs中的F11是逐语句遇到函数会进去 bt命令 查看此时的栈帧 我们此时在Sum函数中打了一个断点r后此时停留在Sum函数中bt后即可看到两层栈帧 调试到某一位置时仍然是可以使用l来查看代码的 display命令与undisplay命令 display是常显示某一个变量相当于vs中的监视窗口 常显示的变量也是有编号的 可以使用undisplay 编号来取消某一个变量的常显示 display不仅可以查看变量的值还可以查看变量的地址 p命令 若现在不想常显示但是想查看一下某一变量的值此时可以使用p p不仅可以用来打印变量也可以用来打印运算结果 until命令 until是允许跳转到任意一行的命令 像这里我们通过断点停留在了Sum函数中但是Sum中有一个for循环一步一步调试可能要很久我们就可以直接一个until跳转到for循环结束的位置注意跳转时中间的命令都是会执行的 finish命令 将当前所处的函数跑完 info locals命令 显示当前临时变量的值 watch命令 执行时监视一个表达式如变量的值。如果监视的表达式在程序运行期间的值发生了变化gdb就会暂停程序的执行并通知使用者 watch就是给变量打断点只是这个断点与前面给某一行打的断点不一样不是运行到哪里就停下而是当变量的值发生变化时暂停程序并通知使用者。 set var命令 运行时修改变量的值 可以让我们在发现问题时立刻解决并验证 有了这些命令后gdb与vs中调试的功能已经差不多了但是gdb的缺点是无法在调试的过程中看到代码。此时可以使用cgdb这样就能一边调试一边查看代码了。 7.3 cgdb cgdb会将终端分屏操作与gdb类似 7.4 条件断点 条件断点就是满足一定条件时才会暂停程序的断点 新增条件断点有两种方式1. 新增一个条件断点 2. 给已有断点增加条件 新增条件断点b 行数/函数 if 条件 给已有断点增加条件condition 断点编号 条件 无论时watch还是条件断点本质都是断点删除时直接d 编号即可