文章内容:

通过VMware安装Ubuntu的linux镜像,可以在官网上下载,建议选择磁链下载快些

然后接下来可以看视频教程

在VMware所虚拟出来的Ubuntu系统镜像上进行操作
打开终端:ctrl+alt+t
cat /etc/shells 查看当前目录下支持shell的文件
echo $SHELL 查看当前环境下的bash
shell和bash的作用是一致的,都是用来执行命令
history 查看历史记录
按tab键可以补齐命令或者查找以某个字符开头的所有命令
热键:ctrl+p 回到上一行命令  ctrl+n 回到下一行命令  ctrl+b 回到左边的命令  ctrl+f 回到右边的命令  对应上下左右,ctrl+a 回到行头  ctrl+e 回到行尾  ctrl+u 清空整行  ctrl+l 清屏   放大 ctrl+Shift 加上'+'号    缩小 ctrl+ '-'号
cd .. 回到上一级目录
pwd 查看当前目录
ls 查看系统目录
系统目录介绍:
bin 存放可执行文件
date 查看当前时间
cd bin 进入bin目录
ls 查看bin目录下的文件
找到date可执行文件
./date 执行date
dev 设备目录 存放设备文件,如鼠标mice
cd dev 进入dev目录
ls 查看dev目录下的文件
echo mice 查看鼠标设备文件
sudo cat mice 进入鼠标设备文件
ctrl+c 退出
etc 用户配置文件
cd etc 进入etc文件
ls 查看etc目录下的文件
vi passwd 查看用户密码信息
ls ../ 查看当前目录的上一级目录下的文件夹
ls /home 查看home目录下的文件夹
ls / 查看根目录下的文件夹
ls -lah /home 查看home目录下的文件夹大小和时间,如果是d开头则代表是一个文件夹,如果是-开头则代表是一个文件
ls -a 查看当前目录下的隐藏文件
cd ~ 回到家目录
cd /etc/bin/ 通过绝对路径进入到ect目录下的bin文件夹
mkdir mydir 在当前目录下创建一个mydir目录
mkdir -p a/b/c 在当前目录下创建一个a文件夹,a文件夹里再创建一个b文件夹,b文件夹里再创建一个c文件夹
sudo apt install tree 下载tree工具
tree a/ 查看a目录的所有文件结构
cd mydir/ 进入mydir目录
mkdir a/ b/ c/ 创建多个文件夹
rm -rf * 删除当前目录下的所有文件夹
touch linux.txt 在当前目录创建一个.txt文件
touch ../linux 在上一级目录创建一个linux文件
touch /home/bing/myfile 通过绝对路径在home下的bing目录下创建一个myfile文件
rm file01 删除当前目录下的file01文件
rm /home/bing/file02 通过绝对路径删除bing目录下的file02文件
rm -rf a/ 删除当前路径下的a文件夹
rm -rf /home/bing/a/ 通过绝对路径删除home下的bing目录下a文件夹
cp linux bak/ 将当前目录下的linux文件复制到bak/目录下
cp -r abc/ bak/ 将当前目录下的abc/文件夹复制到bak/目录下
clear 清屏
mv linux bak/ 将当前目录下的linux文件移动到bak/文件夹下
cd bak/ 进入bak目录
mv linux linux007 将当前目录下的linux文件重命名为linux007
mv /home/bing/bak/linux007 . 通过绝对路径将home下的bing下的bak下的linux007文件移动到家目录下
man ls 查看Linux下的关于ls的所有命令手册
help cd 查看LInux下的关于cd的所有命令手册
man man 查看Linux下的关于man的所有命令手册
reboot 重启Linux系统
shutdown -h now 关机
vim
在目录下输入:vim linux007 进入vim编译linux007文件的界面
进入到编译界面后输入 i 表示编辑这个文件
在输入完代码后按下esc键退出编辑 然后输入':'号,再输入w,然后回车,当命令提示后输入y ,确定保存,回车
输入':' q 回车 退出vim
在目录下输入:gedit linux007 进入到gedit编译linux007文件的界面
然后在里面编辑文件,可以直接点击保存,关闭
在目录下输入:nano linux007 进入到nano编译linux007文件的界面
然后输入ctrl+o编辑文件名 回车 编辑文件,然后ctrl+s保存文件 ctrl+x退出
换源
更新清华源:
vim /etc/apt/sources.list 查看当前源
sudo cp /etc/apt/sources.list sources.list.bak 备份源
https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/ 进入位置复制对应的版本的文件
sudo vim /etc/apt/sources.list 打开配置文件,按esc键后,先按gg,再按dG,将文本全部删除,然后复制上面网站中的内容
sudo apt-get update 更新软件源
sudo apt-get upgrade 读取软件列表,保存在本地电脑
gcc

在终端下输入:sudo apt update 然后输入密码,安装管理软件的包,sudo代表切换当前用户从switch user切换为root,apt update代表管理软件的包
sudo apt install build-essential gdb 安装gdb调试器
gcc --version 查看gcc是否安装成功
g++ --version 查看g++是否安装成功
gdb --version 查看gdb是否安装成功
sudo apt install cmake 安装cmake
cmake --version 查看cmake是否安装成功
sudo apt-get install fcitx 安装搜狗输入法
编译
gcc编译c++文件有4步:
.c/.cpp >>编译器(预编译)>>.i>>编译器(编译)>>.s>>汇编器>>.o>>连接器>>可执行文件
cd testcpp/ 进入testcpp文件夹
vim test.cpp 创建一个名为test.cpp的文件并通过vim编辑器进入
:set ts=4 回车 将tab键的宽度从默认的8改为4
按下 i 键进入输入模式
输入完代码后按esc退出 ,然后输入 :wq 保存并退出
退出到终端后输入 g++ test.cpp -o test 回车编译并链接test.cpp文件
输入ls 查看当前目录下的可执行文件,可执行文件颜色为绿色
输入 ./test 执行test可执行文件
rm test 删除可执行文件
g++ -E test.cpp -o test.i  将test编译为预处理文件
vim test.i 查看预处理文件
g++ -S test.i -o test.s 将test.i预处理文件编译成汇编语言文件
vim test.s 查看汇编语言文件
g++ -c test.s -o test.o 将汇编语言文件编译成机器语言的二进制可识别文件
vim test.o 查看机器语言二进制文件
g++ test.o -o test 将机器语言的二进制文件编译成可执行文件
./test 运行可执行文件
g++ -g test.cpp -o test 产生一个能被调试的可执行文件test
g++ test.cpp -o2 -o test_o2 使用-o2优化代码,并生成test_o2可执行文件
ls -lh 查看两个可执行文件的大小
./test_o2 执行o2优化后的可执行文件
time ./test 通过time查看未优化的可执行文件的执行时间 real
time ./test_o2 通过time查看优化后的可执行文件的执行时间 real
g++ -lglog test.cpp 链接glog库,通过-l
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp 链接mytest库,通过-L加上库的绝对路径,再通过-l链接库
g++ -I/myinclude test.cpp 指定头文件所在的目录,在相对路径前面加上大写的i
g++ -Wall test.cpp 打印警告信息
g++ -w test.cpp 关闭警告信息
g++ -std=c++11 test.cpp 设置c++编译标准编译test.cpp
g++ test.cpp -o test 编译并指定输出文件名,将原本的a.out重命名为test
g++ -DDEBUG test.cpp 如果在.cpp文件里定义了:
#ifdef DEBUG
cout<<"DEBUG"<<endl;
#endif
那么执行上面的命令,在#ifdef DEBUG里的代码就会被执行
man gcc 查看gcc的英文手册
 sudo apt install tree -y 下载tree查看目录文件
tree . 查看当前目录的结构
分文件编译
在根目录下创建Demo01文件夹,Demo01文件夹下分别创建include文件夹和src文件夹,在include文件夹创建swap.h头文件,在src文件夹下创建swap.cpp文件,最后再在Demo01文件夹下创建main.cpp文件
g++ main.cpp src/swap.cpp -Iinclude 分文件编译main.cpp文件,main.cpp文件里面引入了swap.h文件,再通过src/swap.cpp指定swap.cpp文件的目录,而swap.cpp文件里又引入了swap.h头文件,所以需要通过-I指定头文件目录
./a.out 运行可执行文件
g++ main.cpp src/swap.cpp -Iinclude -Wall -std=c++11 -o b.out 重新生成可执行文件,加上报错提示信息和c++标准,并且把原本的a.out重命名为b.out
./b.out 运行可执行文件
rm *.out 将以.out结尾的文件全部删除
将swap.cpp文件生成静态库文件
在 Linux 中,库文件分成静态库和共享库两种➀。静态库以.a 作为后缀名,共享库以.so 结尾。所 有库都是一些函数打包后的集合,
差别在于静态库每次被调用都会生成一个副本,而共享库则只有 一个副本,更省空间。
静态库最后都会被集成到可执行文件中,动态库不会
cd src/ 进入src文件夹
g++ swap.cpp -c -I../include 将swap.cpp生成swap.o汇编文件,-I后面指定的是头文件目录
ar rs libswap.a swap.o 将swap.o汇编文件生成swap.a静态库文件,lib后面就是要生成的库文件名
cd .. 回到上级目录
g++ main.cpp -lswap -Lsrc -Iinclude -o static_main 编译main.cpp并链接静态库文件,-l后面指定静态库名称,-L后面指定静态库的路径,-I后面指定头文件目录,-o将文件重命名为static_main可执行文件
./static_main 运行可执行文件
cd src/ 进入src文件夹
rm swap.o 删除.o汇编文件
g++ swap.cpp -I../include -fPIC -shared -o Iibswap.so 用swap.cpp生成swap.so的动态库,-I后面是头文件的目录
cd .. 回到上一级目录
同时有动态和静态库存在时会优先链接动态库
g++ main.cpp -Iinclude -lswap -Lsrc -o dyna_main 编译main.cpp文件,并且链接到src下的动态库,将生成的可执行文件重命名为dyna_main
ls -l 查看当前目录下的文件的字节数
LD_LTBRARY_PATH=src ./dyna_main 执行动态库的可执行文件,其中src是动态库所在的目录
gdb
常用命令:
h 查看命令帮助
r 运行文件(run-text:加载文本文件,run-bin:加载二进制文件)
start 单步执行(停在第一行执行语句)
l 查看源代码(list-n:从第n行开始查看代码,list+函数名:查看具体函数)
set 设置变量的值
n 单步调试(逐过程)
s 单步调试(逐语句:跳入自定义函数内部执行)
bt 查看函数的调用栈和层级关系
f 切换函数的栈
i 查看函数内部局部变量的数值
finish 结束当前函数,返回到函数调用点
c 继续运行
p 打印值和地址
quit 退出gdb
b+n 在第n行设置断点
i b 查看当前设置的所以断点
d breakpoints n 删除第n个断点
display 监视变量
undisplay 取消监视变量
watch 被监视的变量发生修改时,打印显示
i watch 显示监视的变量
enable breakpoints 启用断点
disable breakpoints 禁用断点
x 查看内存
run argv[1] argv[2] 调试时给命令行传参
set follow-fork-mode child#Makefile 项目管理:跟踪父子进程
在根目录新建一个Demo02文件夹,在里面用vim新建一个test01.cpp文件
:set nu 显示行号
分屏回到上一级目录下 g++ test01.cpp -o a_no_g 生成a_no_g可执行文件
然后再 g++ -g test01.cpp -o a_yes_g 生成a_yes_g带调试器的可执行文件
ls -l 查看两个可执行文件的大小
gdb a_no_g 进入调试可执行文件的界面,提示无法调试没有调试器的文件
quit 退出gdb调试界面
gdb a_yes_g 进入调试带调试器的可执行文件界面
//gdb打开后 ctrl-x ctrl-a 进入tui模式 比开两个窗口好多了
//也可以直接使用命令 gdbtui - q 要调试的文件名称
run 执行代码
break 13 在代码的第13行打一个断点
info breakpoints 提示断点的信息
b 14 在代码的第14行打一个断点
i b 提示断点的信息
quit 退出gdb
gdb a_yes_g 重新进入调试界面
b 13 在代码13行打一个断点
r 运行程序
p i 查看i变量的值
p N 查看N变量的值
continue 继续执行
p i 查看i变量的值,因为是在一个循环里面,所以每次都会撞上那个断点,而i是不停变化的
display i 不断的监视i变量的值
c 继续执行
回车 按下回车键会继续执行上一次命令,跟c的效果是一样的
//n 一行一行执行
list 查看断点周围的代码
l  查看断点周围的代码
display sum 监视sum变量
c 继续执行
quit 退出程序
vscode
在浏览器输入 https://code.visualstudio.com/ 进入vscode官网下载linux版本并安装
快捷键:alt+'↑',alt+'↓',将某一行上下移动
ctrl+` 打开终端
ctrl+shift+p 打开命令面板
ctrl+p 转到其他文件
ctrl+w 关闭当前文件
ctrl+b 关闭侧边栏
F2 变量统一重命名
F12 转到定义处
ctrl+shift+F 在整个文件夹中查找
 在桌面新建一个C++文件夹,然后 cd C++进入该文件夹,然后 code . 用vscode打开该文件夹
在文件夹中新建一个helloworld.cpp的文件
写完代码后在终端: g++ helloworld.cpp -o helloworld 生成可执行文件
然后 ./helloworld 运行
分文件编译:在根目录新建include文件夹和src文件夹,然后在include文件夹新建swap.h文件,在src文件夹新建swap.cpp文件,然后在根目录新建main.cpp文件,写完代码后打开终端输入:g++ main.cpp src/swap.cpp -Iinclude -o main 生成可执行文件
然后./main 运行
如果一个文件在打开的时候会被下一个打开的文件覆盖掉,那么就在打开的文件的名字上双击就可以固定
ctrl+shift+i 格式化
F2 将所有文件的某个函数名字重命名
CMake
gcc实际编译,make是构建工具,cmake是跨平台自动化工具
cmake语法:参数之间使用空格或者分号隔开,指令不区分大小写,参数和变量区分大小写
指令:cmake_minimum_required(VERSION 3.0) 指定cmake最低版本
project(HELLO) 定义工程名称为HELLO
set(SRC sayhello.cpp hello.cpp) 定义SRC变量,其值为main.cpp hello.cpp
include_directories(/usr/include ./include) 将/usr/include 和 ./include添加到头文件路径搜索
link_directories(/usr/lib ./lib) 将/usr/lib 和./lib添加到库文件搜索路径
add_library(hello SHARED ${SRC}) 通过变量SRC生成libhello.so动态库
add_library(hello STATIC ${SRC}) 通过变量SRC生成libhello.a静态库
add_compile_options(-Wall -std=c++11 -o2) 添加编译参数 -Wall报错提示 c++11标准 -o2优化
add_executable(main main.cpp) 编译main.cpp生成可执行文件main
target_link_libraries(main hello) 将hello动态库文件链接到可执行文件main
add_subdirectory(src) 添加src子目录,src中需有一个CMakeLists.txt文件
aux_source_directory(. SRC) 定义SRC变量,其值为当前目录下所有源代码文件
add_executable(main ${SRC}) 编译SRC变量所代表的源代码文件,生成main可执行文件
常用变量: CMAKE_CXX_FLAGS g++编译选项
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
set(CMAKE_BUILD_TYPE Debug) 设定编译类型为debug,可调试
set(CMAKE_BUILD_TYPE Release) 设定编译类型为release,可发布
Debug自动加-g参数,Release会加上o3优化以及关闭debug调试
CMAKE_C_COMPILER 指定C编译器
CMAKE_CXX_COMPILER 指定C++编译器
EXECUTABLE_OUTPUT_PATH 可执行文件输出的存放路径
LIBRARY_OUTPUT_PATH 库文件输出的存放路径
cmake案例:
用vscode在文件夹下新建一个文件名为: CMakeLists.txt
cmake_minimum_required(VERSION 3.0) 指定cmake的最低版本
project(HELLOWORLD) 指定项目名称
add_executable(helloWorld_cmake helloworld.cpp) 指定编译的源文件,helloWorld_cmake是要生成的可执行文件名
在终端输入:cmake . 对当前目录下的cmake进行编译
在终端输入:make 生成可执行文件
./helloWorld_cmake 运行
将其他的文件删除然后在终端输入: mkdir build 新建文件夹
cd build/ 进入文件夹
cmake .. 通过外部构建的方式构建项目,两个点代表在上一层查找CMakeLists.txt文件
make 生成可执行文件
./helloWorld_cmake 运行
进入分文件编写的文件夹
在文件夹里面新建CMakeLists.txt文件
cmake_minimum_required(VERSION 3.0) 设置最低版本
project(SWAP) 指定项目名称
include_directories(include) 指定头文件存放的目录
add_executable(main_cmake main.cpp src/swap.cpp) 生成可执行文件 main_cmake是要生成的可执行文件名,main.cpp是源文件,src/swap.cpp是分文件的目录
mkdir build2 创建启动文件夹
cd build2/ 进入启动文件夹
cmake .. 启动项目
make 生成可执行文件
ls 查看文件
./main_cmake 运行
实战
新建一个文件夹 mkdir Project
cd Project/ 进入文件夹
code . 用vscode打开该文件夹
pwd 查看当前文件夹所在路径
分别创建include和src文件夹,在include文件夹中创建Gun.h头文件,在src文件夹中创建Gun.cpp文件,写完代码后在include文件夹中再创建一个Soldier.h头文件,在src文件夹中再创建一个Solider.cpp文件,写完代码后再在上一级目录下新建一个main.cpp文件,编写完代码后打开终端输入: g++ main.cpp src/Gun.cpp src/Solider.cpp -Iinclude -o myexe -Wall -g -o2
./myexe 运行
在目录下新建 CMakeLists.txt文件
cmake_minimum_required(VERSION 3.0) 指定cmake版本
project(SOLIDERFIRE) 指定项目名称
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -Wall") 为编译添加优化选项
set(CMAKE_BUILD_TYPE Debug) 为编译添加调试选项
include_directories(${CMAKE_SOURCE_DIR}/include) 添加头文件目录
add_executable(my_cmake_exe main.cpp src/Gun.cpp src/Solider.cpp)
mkdir build 新建启动文件夹
cd build/ 进入文件夹
cmake .. 编译项目
make 生成可执行文件
./my_cmake_exe 运行
配置vscode
点击vscode侧边栏的调试按钮,点击run运行,点击C(GDB/LLDB),再点击g++ -生成和调试活动文件 点击Abort生成launch.json文件
将"program"字段改成: "program":"${workspaceFolder}/build/my_cmake_exe", 代表可执行文件的路径
新建一个tasks.json文件