前言
介绍基本使用以及概念
一、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_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
配置用户信息
$ 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加密的,所以我们需要配置验证信息:
可以参考该文
现在github新建一个仓库
根据github的提示一步步操作即可
选中一个文件夹目录在改目录下使用命令
git init #初始化
该命令执行完后会在当前目录生成一个隐藏的 .git 目录。使用我们指定目录作为Git仓库。
在改目录使用命令git inti,提示Initialized empty Git repository in D:/curriculum design/.git/,即成功,并且这个时候在改目录下打开git bash
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
可能出现的错误
这是第一次提交
下一次提交的时候使用命令
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文件
不使用make的编译方法
使用make编译,首先编写makefile文件
vi makefile
执行
make
(64条消息) C语言makefile文件_c程序 makefile_C语言技术网-码农有道的博客-CSDN博客
这里只是简单的试一下make,我们的主要目的还是CMake嗷,makefile文件的一下别的用法参数可以参考这篇文章
CMakeLists.txt
demo1(单文件)
先一个简单的例子看看具体怎么做的
#先cd到你的工作空间下
vi test.cpp
vi CMakeLists.txt #这个不能拼错
cmake ./ #./代表当前文件夹下的所有文件
make
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 入门实战 | HaHack其余教程可参考这篇教程,包括自定义编译选项,安装和测试等。