新手在linux下写代码(vim,gcc和git)

  在linux下gcc和g++用起来几乎一样,所以会gcc也就会g++了。

  vim部分

  不过gcc/g++是对写的代码进行编译,它本身不能用来写代码。

  写代码我们用的vim,使用命令:vim test.c   ,如果test.c存在,那么它将会打开这个文件在我们上次写的进度开始编写,如果没有这个文件,那么就会创建一个test.c文件并打开给我们编写。

  vim本质是一个文本编辑器(记事本),如果没有给vim进行配置的话,它就是一个普通的记事本,我们可以通过配置使它在编写代码时变得便捷。

  关于配置vim:

  简单的配置,我们可以先执行  

sudo vim /etc/vim/vimrc

    先进入到vimrc文件中,按i进入插入模式后,可以输入以下设置

set nu           "在左侧行号                                                
 set tabstop      "tab 长度设置为 4
 set nobackup     "覆盖文件时不备份
 set cursorline   "突出显示当前行
 set ruler        "在右下角显示光标位置的状态行
 set autoindent   "自动缩进

 这样我们就能给我们的vim加上一些简单的功能。

  对于vim 我们作为新手需要了解vim的三种模式:

  1.命令模式:当我们进入vim的时候默认时命令模式,我们可以使用一些命令或者使用hjkl(对应左下上又)对代码光标进行位移。

  2.底行模式:在命令模式下输入:后进入底行模式,比如:wq为退出并保存。

  3.插入模式:在命令模式下按i/a/o进入,进入后才可以做文字输入,按esc可退回到命令模式。

  关于移动光标有以下命令:
vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母h j k l,分别控制光标左、下、上、右移一格
按「G」:移动到文章的最后
按「 $ 」:移动到光标所在行的“行尾”
按「^」:移动到光标所在行的“行首”
按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l
按[gg]:进入到文本开始
按[shift+g]:进入文本末端
按「ctrl」+「b」:屏幕往“后”移动一页
按「ctrl」+「f」:屏幕往“前”移动一页
按「ctrl」+「u」:屏幕往“后”移动半页
按「ctrl」+「d」:屏幕往“前”移动半页
  关于删除有以下命令:
「x」:每按一次,删除光标所在位置的一个字符
「#x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符
「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
「dd」:删除光标所在行
「#dd」:从光标所在行开始删除#行
  关于复制命令:
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
  
  替换
「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
撤销上一次操作
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回
复。
「ctrl + r」: 撤销的恢复
更改
「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字
跳至指定的行
「ctrl」+「g」列出光标所在行的行号。
「#G」:例如,「15G」,表示移动光标至文章的第15行行首。
列出行号
「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号。
跳到文件中的某一行
「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,
再回车,就会跳到文章的第15行。
查找字符
「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。
保存文件
「w」: 在冒号输入字母「w」就可以将文件保存起来

  gcc部分

理解编译原理:

  当我们写了一个test.c代码,它就是一个源文件,它需要经过编译器的预编译,编译,汇编,链接最终来形成我们的二进制可执行程序。
命令的使用:
  假设源文件是test.c,test为目标文件,那么执行命令 :gcc test.c -o test 即可完成编译。

编译的各个阶段:

1.预编译:
  预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
2.编译:
  在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码
3.汇编:
  汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
4.链接:
  首先在说链接前需要搞清库这个概念,我们都知道使用一个stdio.h里面的一个函数时,头文件里面它只有声明没有实现,那么我们在调用函数的时候,它是如何调用的呢? 答案是系统把这些函数的实现都放在了libc.so.6的库文件当中了,当没有特定指明时,编译器会在系统默认的搜索路径“/usr/lib”下来查找函数的实现,也就是链接到这个库函数当中了。
  然而库它又分为两种,一种是静态库,一种是动态库。
静态库:
它是把库中的代码全部拷贝到我们的文件当中,这样链接的时候可以直接在本地进行查找然后链接,其后缀名一般为 “-a”。
动态库:
它是在程序执行的时候链接文件加载库,其后缀名一般为“.so”, libc.so.6就是一个动态库。gcc编译的时候默认使用动态库,如果在编译命令的末尾加上-static指定链接为静态库。
静态库和动态库的区别:
一般的代码是静动态库混着用的。
静态库:优点:不依赖库,程序可以独立运行。缺点:体积大,消耗资源(包括内存,磁盘,网络)。
动态库:优点:因为是共享库,所以它节省资源。缺点:一旦动态库缺失程序将无法运行。

拓展gcc的选项:

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S  编译到汇编语言不进行汇编和链接
-c  编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w  不生成任何警告信息。
-Wall 生成所有警告信息。

关于调试(gdb)

背景:

1.程序的发布方式有两种,一种是debug模式,另一种是release模式

2.在linux的gcc/g++下编译出来的程序默认是release模式。

3.如果要改为debug模式,那么需要在编译源文件的时候在其后面加上 -g选项。

4.在gdb下会自动保存上一个命令,直接在空命令行按回车就会执行。

使用gdb:

退出:

  退出gdb使用ctrl+d或者quit。

调试:
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
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):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
quit:退出gdb

关于自动化构建工具-makefile

背景:

  听着很高级,其实主要实现我们在VS下的ctrl+f5自动完成编译的功能,甚至还没有VS的好,那我们为什么还要用呢?

  新手阶段可能感受不到,是否会写makefile可以从侧面反映出一个人是否具备完成大型工程的能力,它的好处是只要写好了makefile,它们它的编译工作就可以变得自动化,极大的解放了程序猿的双手,提高开发效率。

  make是一个命令工具,是一个解释makefile中指令的工具

  make是一个命令,makefile是一个文件。二者搭配完成项目自动化构建。

使用:

简单代码示例:

test:test.c 

	@gcc $^ -o $@
.PHONY:clean

clean:
	@rm -f test

其中@的作用是隐藏执行代码。第二行的$^代表源文件,$@代表目标文件。clean用.PHONY修饰,是把它设置成伪目标,它的特性是总是被执行。

注意:配置好后在命令行直接输入make进行自动化编译,进行清除就用make clean。

并且,clean:在makefile中一定要顶格写。

那么的原理是什么呢?

首先是make执行后它就会在当前目录下去找makefile或者Makefile文件,它会根据依赖关系来找到test.c文件然后来执行后边的语句。如果有多个目标文件且有着层层的依赖关系,那么它会智能的根据源文件来依次生成目标文件,当然如果找不到就会退出且报错。

初学makefile并在linux下写的进度条代码复习test2023_8_26/Test · 藤原聪明/LinuxTestCode - 码云 - 开源中国 (gitee.com)

关于git 

首先要安装git,可以用 “yum install git ”。

我们的系统第一次使用git的时候要先配置我们的用户名和邮箱,不然可能正常使用命令时会报错

#配置用户名
git config --global user.name xxx
#配置邮箱
git config --global user.email  xxx@xxx.com
#检测配置
git config --list

用 git --help可以查看git的帮助手册。

配置好后,以gitee为例,当我们创建好代码仓库的时候,复制好仓库的地址链接,执行 git clone +地址,把远程仓库拉取到本地。

提交代码到远程仓库三板斧:

第一步.git add +文件名:添加文件到这个本地仓库中,可以使用“git add .”来全部添加。

第二步.git commit -m " xxxx":提交改动并提交更新日志,""里面是此次改动的说明,要认真填写。

第三步.git push:将add的内容进行推送,并附上我们写的日志。至此远程仓库也会有反馈,说明提交成功。

(待续。。。。。。。)

注意 :git push 后问你的username,就是你的账号,比如手机号或者邮箱。下一步就要填你的git的密码。

对了关于文件的理解:文件=文件内容+文件属性。

另外,如果你想对一个新的目录上传代码,

发现有这样类似没有找到.git目录的报错,可以执行命令

git init

还有,如果想撤回上一次git add 的所有内容,可以使用

git reset

 

---------------------------------------------------------------------------------------------------------------------------------

补充操作 

 可以用如上方式在vim的命令行模式中对函数进行查找。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值