开发工具


前言

​ 介绍基本使用以及概念

一、vim

vim在大多数的IDE都是有支持插件的,以下操作是在vscode进行的。

在插件商店搜索 vim

第一个就是

在windows下安装就可以使用了,在Mac中用根据插件说明进行设置。

模式

vim有四种模式:

普通模式:可以进行换行等操作

插入模式:字面意思,再次模式下可以进行文字的输入

可视化模式:可以选择一块编辑区域,然后对选中的文件内容执行插入、删除、替换、改变大小写等操作

命令行模式:在这种模式可以进行一些命令操作

模式之间的转化

基本操作

对应按键 操作
h 光标向左移动
k 光标向上移动
l 光标向右移动
j 光标向下移动
0 跳到行首
^ 跳到从行首开始的第一个非空字符
$ 跳到行尾
gg 跳到第一行
G 跳到最后一行
f+{char} 光标跳到下一个{char}所在的位置
F+{char} 光标跳到上一个{char}所在的位置
重复上一次的查找动作
dd 剪切光标所在的行
n+d 向上剪切n行
n+dd 向下剪切n行
yy 复制光标所在的行
n+y 向上复制n行
n+yy 向下复制n行
p 粘贴操作
c 修改操作(删除并进去插入模式)
ctrl+r 重复上一次的操作
ctrl+f 向下翻页
ctrl+b 向上翻页
v 进入可视化操作
~ 将光标下的字母改变大小写

以上列出的仅仅是一些常用的操作,还有一些操作用的不是很多或者都可以用以上操作代替就没有罗列

这里的 d c y v等叫做操作符,操作符可以配合着动作实现一些操作

动作与操作符

动作的格式:

按键 作用
iw 改变单词
i( 改变()里的内容
i{ 改变{}里的内容
i< 改变<>里的内容
i[ 改变[]里的内容
i” 改变””里的内容
i’ 改变‘’里的内容

这里的i可以用a来代替,但是实现的效果不同

操作格式:

操作符+动作(这里一共要分别按三次按键才行,不是一起按的)

例如

int main(){
	string str = {"hello"};
    vector<int>a;
}

如果我想要删除这个hello单词的话

d+iw(先按d再按i再按w)这样就可以删除hello单词

那么如果是

d+aw(先按d再按a再按w)这样的话也可以删除hello单词,但是同时会删除掉” “

这就是两者的不同用i不会包括旁别的符号,用a会包括

举一反三的,要是想将vector< int >a里的int 复制,就可以

**y+i<**(先按y再按i再按<)

以上都是在普通模式下进行的操作,在可视化模式中就是类似鼠标操作,可以选中一片区域的代码

当前可以使用操作符进行一些操作

在vscode中使用的技巧

操作 实现功能
g+d 查看函数的实现(跳转到函数定义)
g+h 查看函数的模板及重载
g+t 跳转到下一个标签页
g+T 跳转到上一个标签页
n+g+t 跳转到第n个标签页
ctrl+0 跳转到旁别的资源管理器一栏,选中想要打开的文件按回车进入
ctrl+~ 跳转到终端,ctrl+1回到代码栏

终端中使用

在终端中使用vim还是有些不同的,比如没有了解过vim的第一次在Linux系统中以vim的方式打开文件甚至都不知道怎么保存退出,这里的保存退出就涉及到了命令行模式。(有时间再写捏)

二、git

Git工作流和核心原理 | GitHub基本操作 | VS Code里使用Git和关联GitHub_哔哩哔哩_bilibili

强烈建议先观看该视频

git大全

git_learn十分推荐该网站,有实例操作和图形演示

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

安装配置

Git支持在windows,Linux,mac等系统运行

windows:

下载链接

Linux:

$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
  libz-dev libssl-dev
  
$ apt-get install git

安装完成后使用命令查看是否成功安装

git --versoi

Linux也可以使用这个命令来查看

配置用户信息

$ git config --global user.name "xxxxx"
$ git config --global user.email xxxxx@xxxxx.com

查看配置信息

$ git config --list

Git工作流程

  • 克隆 Git 资源作为工作目录。
  • 在克隆的资源上添加或修改文件。
  • 如果其他人修改了,你可以更新资源。
  • 在提交前查看修改。
  • 提交修改。
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交

Git工作分区

分区 功能
工作区 在git管理下的正常目录都算是工作区。就是你平时存放项目代码的地方,本地代码
资源区 资源库(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
暂存区 暂存区,用于临时存放你的改动。
git仓库 远程仓库,托管代码的服务器。

分区关系

在你的workspace写好的代码使用add放入暂存区index,在commit提交到资源库,再见资源库的文件push到远程仓库

所以git管理的文件有三种状态:

已修改 已暂存 已提交

文件的状态

Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.

比如该文件夹下的QT是刚新建的,如果想上传到远程仓库首先要将这个文件放在暂存区

git add QT

这样QT文件就变成暂存状态了。

Staged: 暂存状态。执行git commit则将修改同步到库中, 相当于给文件一个标记,当执行git commit有这个标记的就会上传到资源区

committed:已经是提交状态了,执行git pull即可上传到远程仓库

modified: 表示修改了文件,但是还没保存到数据库中

Git创建远程仓库

关联远程仓库(以github为例)

由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息:

可以参考该文

配置SSH

现在github新建一个仓库

默认配置即可

创建成功的界面

根据github的提示一步步操作即可

选中一个文件夹目录在改目录下使用命令

git init #初始化

该命令执行完后会在当前目录生成一个隐藏的 .git 目录。使用我们指定目录作为Git仓库。

将这个文件创建一个git仓库

在改目录使用命令git inti,提示Initialized empty Git repository in D:/curriculum design/.git/,即成功,并且这个时候在改目录下打开git bash

目录旁别有master的标识

git add --all #add也可以跟你想要git的子文件夹
git commit -m "C++课设" #第一次提交并备注提交信息
git branch -M main  #这个可以不执行,执行之后主分支就是main,不执行的化就是默认的master
git remote add origin https://github.com/LookAt-MeNow/Curriculum_Design.git #添加远程仓库,这个命令具体根据你自己的不能复制我的这个
git push -u origin main #这里如果没有运行branch -M main 的话就应该是maseter而不是main

我没有运行branch所以不能用main

可能出现的错误

git限制文件大小,如果单文件大于100m会push失败

解决方法

这是第一次提交

下一次提交的时候使用命令

git status  #更新目录
git add .
git commit -m "注释"
git push

这样代码就上传到远程仓库了

从远程clone别人的仓库到本地

git clone #+仓库地址

如果要更新从远端更新工作区,可以直接使用git pull,但是这样会把原来的工作区文件丢失,可以先使用git fetch,将远程仓库更新至资源库,使用git diff比较远程仓库和工作区的不同,选取不同的文件进行更新。

基本命令

git init     #初始化仓库
git add .    #添加文件到暂存区。
git commit 	 #将暂存区内容添加到仓库中
git add	     #添加文件到暂存区
git status	 #查看仓库当前的状态,显示有变更的文件。
git diff	 #比较文件的不同,即暂存区和工作区的差异
git commit	 #提交暂存区到本地仓库。
git reset	 #回退版本。
git rm	     #将文件从暂存区和工作区中删除
git mv	     #移动或重命名工作区文件
git log	     #查看历史提交记录
git remote	 #远程仓库操作
git fetch	 #从远程获取代码库
git pull	 #下载远程代码并合并
git push	 #上传远程代码并合并

git statuas

使用改命令后即可标记出当前修改过的文件,和新建的没有被追踪的文件

Git分支管理

git分支主要是多人协作开发使用,当只有一个主分支的时候如果你有一个需要2周才能完成的代码,第一周写了50%,如果现在你要提交的话就是一个半成品影响别人的使用,如果不提交的话又存在丢失进度的风险,现在创建一个只属于你自己的分支,所有代码都提交到这个分支上,当开发完成在把改分支合并到主分支。

创建分支:

在Git中开始就存在一条主线master,有一个指针HEAD指向master,HEAD是指向当前分支的,如果当时用的是master分支就指向master,如果是别的分支就指向别分支。

git_learn该网站形象的描绘了这一过程

首先我们需要创建一个分支bugFix

git branch bugFix   #创建bugFix分支
git checkout bugFix #转到bugFix分支,也就是让HEAD指针指向bugFix

这两句可以合成一条命令

git checkout -b bugFix  #创建并转到bugFix分支

使用 git branch 可以查看当前所有分支,和当前指向的分支

git branch
* bugFix
  master

*就代表当前的分支是bugFix

合并分支:

现在就可以在bugFix分支进行提交的操作了,当在bugFix的任务完成后切换回master分支

git checkout master

这个时候在bugFix提交的文件在master是看不到的

现在将bugFix分支合并到master分支来

git merge bugFix  

删除分支:

合并完成后就可以删除bugFix分支了

git branch -d bugFix

在最新的git版本中checkout也可以用switch来代替,使用方法相同,不过在新建并转到分支有些不同

git switch -c bugFix #这里是-c,而checkout是-b

Git标签管理

Git标签是和commit协同的,commit相当于一个人的身份证号,标签是他的名字

创建标签:

先转到需要打标签的分支

使用命令 git tag <name.>即可打上一个标签

git tag v1.0

使用git tag可以查看所有标签

git tag

默认标签是打在最新提交的commit上的。

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字

使用git show <name.>可以查看标签的信息

git show v1.0

如果上一次的commit忘记打标签了,可以先使用git log找到对应的commit id

git tag v2.0 #+commit id

这样也是可以给已经提交过的打标签

删除标签:

git tag -d v1.0

没有上传到远端的标签可以直接删除掉

如果要将标签上传到远端,使用命令git push origin <tagname>

git tag origin v1.0

如果有多个标签可以一次全部上传

git tag origin --tag

要是标签已经上传到远端,删除标签操作

git tag -d v0.9     #先删除掉本地的
git push origin :refs/tags/v0.9   #删除远端仓库的

vscode中使用

Git工作流和核心原理 | GitHub基本操作 | VS Code里使用Git和关联GitHub_哔哩哔哩_bilibili

观看这个视频即可。视频里的操作都是图形化的,也可以使用vscode自带的终端来执行

总结

三、CMake

首先理清make ,makefile,CMake, CMakeLists, QMake的关系

为什么会有make,make是干嘛用的?假如现在你又{1…99}.cpp个文件需要编译,不可能说你一个一个文件的编译99次吧,这个时候就有了make,make可以帮助我们快速的编译大量的文件,为什么make会帮我们快速的编译大量的文件,其中的奥妙就是makefile了,你编写了makefile文件,告诉make应该编译那些文件,但是编译一个文件你就要写一句

g++ -g -o 1 1.cpp

但是你有99文件总不能你再写99句这个命令吧,这个时候CMake就来了,CMake就是帮助我们生成makefile的文件,也就是说你只需要使用CMake就可以完成多文件的编译了,但是捏,凭什么CMake又知道你要编译的是什么文件,然后就有了CMakeLists,这个全部过程中你需要干的是就是编写CMakeLists就可以了。

QMake其实就是QT下的构建工具,在QT下你编写的是.pro文件,这个玩意就会根据你写的.pro再进行操作,其实就是相当于,你在QT写了一句代码,但是QT在后台可能给你生成了数十条代码

CMake其实就是高级编译配置工具,当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等),这种场景下就是可以用CMake的。

makefile文件

现在要编译3个程序

不使用make的编译方法

需要你一个一个编译

使用make编译,首先编写makefile文件

vi makefile

最简单的一个makefile文件

执行

make

将我们写的文件都编译了

都编译成功了嗷

全部源文件

(64条消息) C语言makefile文件_c程序 makefile_C语言技术网-码农有道的博客-CSDN博客

原作者视频讲解

这里只是简单的试一下make,我们的主要目的还是CMake嗷,makefile文件的一下别的用法参数可以参考这篇文章

CMakeLists.txt

demo1(单文件)

先一个简单的例子看看具体怎么做的

#先cd到你的工作空间下
vi test.cpp
vi CMakeLists.txt #这个不能拼错
cmake ./  #./代表当前文件夹下的所有文件
make 

源文件和CMakeLists.txt文件内容

CMAKE_MINIMUM_REQUIRED(VERSION 3.10)  #这一句代表cmake的最低版本

PROJECT(demo1)   #代表当前编译的工程

ADD_EXECUTABLE(demo1 test.cpp)  #生成可执行文件,这个test.cpp文件必须要和你创建的文件名相同,demo1可以随便命名其实就和g++ -o demo1 test.cpp这句等效  ,只是为可执行文件起一个别名

这执行完cmake ./这句的时候cmake根据我们写的CMakeLists.txt帮我生成好了makefile文件,这其实也就是cmake最主要的功能之一,帮助我们写了makefile文件。

demo2(单文件夹多文件)

所有的源文件包括头文件都在一个文件夹的情况

跟第一种基本一致

这种情况和第一种CMakeLists.txt只有一点点不一样

CMAKE_MINIMUM_REQUIRED(VERSION 3.10)

PROJECT(demo2)

ADD_EXECUTABLE(demo2 my.cpp test.cpp) #把头文件实现的那个cpp包括进来就可以了

demo3(多目录多文件)

先新建一个文件夹,demo3

mkdir -p demo3/mylib

此时的文件结构

在多目录多文件的情况下,每个文件夹都需要一个CMakeLists.txt文件

demo3下的CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.10)

PROJECT(dome3)

ADD_SUBDIRECTORY(./mylib)

AUX_SOURCE_DIRECTORY(./ DIR_SRCS)

ADD_EXECUTABLE(dome3 ${DIR_SRCS})

TARGET_LINK_LIBRARIES(dome3 mylib)

mylib下的CMakeLists.txt

AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)

ADD_LIBRARY(mylib STATIC ${DIR_LIB_SRCS})

添加完成后,回到demo3文件夹,cmake ./ 再make

这里make可能会出现一个问题

根据报错我们可以得知错误出现在头文件找不到,但是上demo2中就可以找到,这是因为这个时候你的头文件和你的test已经不是一个文件夹,这样是找不到的,要写成**#include”./mylib/my.h**将头文件的路径添加进来

然后就可以了

dmeo4(标准工程目录)

build文件(子目录bin放可执行文件,lib放库文件),src文件(放源文件),include文件(放库源文件)

文件目录

build文件在CMake之前是没有文件的,什么都不用写,有CMakeLists.txt文件时根目录,include,src目录

根目录CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 3.10)

PROJECT(demo4)

ADD_SUBDIRECTORY(./include)

ADD_SUBDIRECTORY(./src)

include目录CMakeLists.txt

AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)
#这句用来将生成的库文件放在${PROJECT_BINARY_DIR}/lib,因为我们是在build文件下cmake的,所以这个${PROJECT_BINARY_DIR}也可以改成build,也就是说这个东西在哪里cmake的就是哪个目录,所以用${PROJECT_BINARY_DIR}这个格式更加规范
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

ADD_LIBRARY(include STATIC ${DIR_LIB_SRCS})

src目录CMakeLists.txt

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

AUX_SOURCE_DIRECTORY(./ DIR_SRC)

ADD_EXECUTABLE(demo4 ${DIR_SRC})

TARGET_LINK_LIBRARIES(demo4 include)

这里源文件复制的是demo3里的,可以直接用,但是还是要改一下的

在demo2中的test.cpp

#include"my.h"
int main(){
        my_info();
        return 0;
}

在demo3中的test.cpp

#include"./mylib/my.h"
int main(){
        my_info();
        return 0;
}

在demo4中的test.cpp

#include"../include/my.h"
int main(){
        my_info();
        return 0;
}

主要就是头文件不同

demo2是所有文件夹都在一个目录下,直接引用my.h就可以了

demo3是test.cpp在根目录,头文件在mylib目录下,在test.cpp看来就是我要找本目录下的(mylib文件夹,那里存的是头文件,所以先定位到本目录就是 ./ 然后就是mylib文件夹

demo3是test.cpp在src目录,头文件在include目录下,在test.cpp看来就是我要找根目录下的include文件夹,那里存的是头文件,所以先回到上一级目录 .. 然后就是include文件夹

以上就可以理解一些简单的应用的,但是熟练掌握的话还在要多用罢

CMake预定义变量

CMake 入门实战 | HaHack其余教程可参考这篇教程,包括自定义编译选项,安装和测试等。


文章作者: zhang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 zhang !
  目录