Prefix: 熟悉常见Linux开发命令,并熟悉Linux中的cmake等操作

1.1 目录结构

常见目录结构:

(1)bin: 存放二进制文件,这些文件都可被运行

(2)home: 除root外其他用户的目录,类似于windows下的/User

(3)root: 用户自己的目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTj5Hk4w-1684044390875)(pics/Linux1.1.png)]

1.2 指令与选项

指令格式: 命令 选项 操作对象

ls -l -a -h /home ./
三个选项 两个操作对象

ls -lah /home ./
一个选项 两个操作对象

以上两条命令等价

1.3 重要指令讲解 在Linux中进行c/c++开发

cltr+alt+t #打开终端

pwd #打印当前目录

ls #列出当前目录下所有文件/文件夹名称

ls ./ #当前目录
ls ../ #当前目录的上一句目录

ls -lah /home
-l: 表示list,表示以详细列表的形式进行展示
-h: 表示以可读性较高的形式显示
-a: 表示显示所有的文件/文件夹(包含了隐藏文件/文件夹)
——————————————————————————————————————
——————————————————————————————————————
cd #改变目录

cd
cd~
这两条命令都是进入当前用户的家目录下

cd 相对路径
cd ..
cd ../local

cd 绝对路径
cd /usr/local

——————————————————————————————————————
——————————————————————————————————————
mkdir 创建目录

mkdir myfolder #在当前目录下创建出目录“myfolder”

mkdir -p 一次性创建出多层目录
mkdir -p ~/a/b/c

mkdir a b c 一次性创建出三个不同的文件夹

——————————————————————————————————————
——————————————————————————————————————
touch 改变文件的时间戳/创建新文件
1. touch将文件的修改时间设置为当前时间
2. 当touch一个不存在的问件时,会自动创建出这个文件。

touch abc.txt
touch ../abc.txt
touch home/c/abc.txt # c is my user name

touch abc.txt myfolder #同时创建txt文件和文件夹

——————————————————————————————————————
——————————————————————————————————————
rm 删除文件或者目录

移除文件
rm abc.txt
rm myfolder

移除目录
mkdir a
rm -rf a
rm -rf /home/c/a

——————————————————————————————————————
——————————————————————————————————————
cp 复制文件/文件夹到指定位置
cp 被复制的文件路径 文件被复制到的路径
cp /home/c/a ./

cp -r 复制整个文件夹 -r 表示迭代复制

mkdir a b
cd a
touch abc.txt def.txt
cd ..
cp -r a b

——————————————————————————————————————
——————————————————————————————————————
mv 移动文件到新的位置,或者重命名文件
mv 需要移动的文件路径 需要保存的文件路径
mkdir a b
mv a b

mv a a_modified_name

——————————————————————————————————————
——————————————————————————————————————
man 调用用户手册
man ls
man cd
man man

——————————————————————————————————————
——————————————————————————————————————
reboot 立即重启linux系统

——————————————————————————————————————
——————————————————————————————————————
shutdown 立即关机
shutdown -h 时间 设置自动关机时间

1.4 文件编辑

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f1hZm6NZ-1684044390876)(/pics/Linux1.4.png)]

主要介绍vim编译器:

vim三种模式切换:
刚刚进入vim是命令模式
按i进入插入模式
在命令模式下按:进入底线命令模式

  • i 切换至编辑模式
  • esc 推出当前模式
  • :w 保存
  • :q 退出文件编辑
  • :q! 不保存并退出
  • e! 放弃所有修改
  • :wq 保存并退出

gedit file Linux下的一个纯文本编辑器

nano file 也是一个文本编辑器

2 开发环境搭建

sudo 切换到root命令下进行操作

sudo apt update # apt在root下
cmake --version 查看版本号

3 GCC编译器

3.1 编译过程

VSCode是通过用GCC编译器来实现c/c++的编译工作

四步:

  1. 预处理 pre-processing // .i 文件
  2. 编译 compiling // .s 文件
  3. 汇编 assembling // .o 文件
  4. 链接 linking // bin 文件

3.2 g++重要编译参数

-E -S -C -O

-g 编译输出带调试信息的可执行文件

g++ -g test.cpp -o test

time ./test 会统计程序执行时间

g++ -Wall test.cpp 打印警告信息

g++ -w test.cpp 关闭警告信息

g++ -std=c++11 test.cpp 设置编译标准

g++ test.cpp -o test 指定输出文件名

4.1 gdb

$(gdb)run(r) # 重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文
件)
$(gdb)start # 单步执行,运行程序,停在第一行执行语句
$(gdb)list(l) # 查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函
数)
$(gdb)set # 设置变量的值
$(gdb)next(n) # 单步调试(逐过程,函数直接执行)
$(gdb)step(s) # 单步调试(逐语句:跳入自定义函数内部执行)
$(gdb)backtrace(bt) # 查看函数的调用的栈帧和层级关系
$(gdb)frame(f) # 切换函数的栈帧
$(gdb)info(i) # 查看函数内部局部变量的数值
$(gdb)finish # 结束当前函数,返回到函数调用点
$(gdb)continue(c) # 继续运行
$(gdb)print(p) # 打印值及地址
$(gdb)quit(q) # 退出gdb
$(gdb)break+num(b) # 在第num行设置断点
$(gdb)info breakpoints # 查看当前设置的所有断点
$(gdb)delete breakpoints num(d) # 删除第num个断点
$(gdb)display # 追踪查看具体变量值
$(gdb)undisplay # 取消追踪观察变量
$(gdb)watch # 被设置观察点的变量发生修改时,打印显示
$(gdb)i watch # 显示观察点
$(gdb)enable breakpoints # 启用断点
$(gdb)disable breakpoints # 禁用断点
$(gdb)x # 查看内存x/20xw 显示20个单元,16进制,4字节每单元
$(gdb)run argv[1] argv[2] # 调试时命令行传参
$(gdb)set follow-fork-mode child#Makefile项目管理:选择跟踪父子进程(fork())
  1. 编译程序时要加上-g,之后才能进行gdb调试:
gcc -g main.c -o main
  1. 回车键会重复执行上一次命令

5.1 VSCode常用快捷键

转到文件 ctrl+p

打开命令面板 Ctrl + Shift + P

打开终端 ctrl + `

当前行上移/下移 alt + up/down

转到定义处 F12/ ctrl 加鼠标左击

在 Ctrl+P 窗口下还可以:

  1. 直接输入文件名,跳转到文件
  2. ? 列出当前可执行的动作
  3. ! 显示 Errors 或 Warnings ,也可以 Ctrl+Shift+M
  4. : 跳转到行数,也可以 Ctrl+G 直接进入
  5. @ 跳转到 symbol (搜索变量或者函数),也可以 Ctrl+Shift+O 直接进入
  6. @ 根据分类跳转 symbol ,查找属性或函数,也可以 Ctrl+Shift+O 后输入:进入
  7. 根据名字查找 symbol ,也可以 Ctrl+T

常用窗口快捷键:

  1. Ctrl+Shift+N 打开新窗口
  2. Ctrl+Shift+W 关闭窗口
  3. Ctrl+N 新建文件
  4. Ctrl+tab 文件间切换

代码编辑相关快捷键

  1. 代码行缩进 Ctrl+[ 、 Ctrl+] 或者 选中后shift tab, tab
  2. 向上向下复制一行: Shift+Alt+Up 或 Shift+Alt+Down
  3. 常用:在当前行下边插入一行 Ctrl+Enter

快捷键:光标相关

  1. 移动到行首: Home
  2. 移动到行尾: End
  3. 移动到文件结尾: Ctrl+End
  4. 移动到文件开头: Ctrl+Home

快捷键:查找替换

  1. 查找 Ctrl+F
  2. 查找替换 Ctrl+H
  3. 整个文件夹中查找 Ctrl+Shift+F

6. CMake

cmake是跨平台安装编译工具

CMakeLists.txt->cmake->mac/windows/Linux->binary executable file

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Vwsfamg-1684044390876)(pics/Linux6.1.png)]

6.2 cmake语法

指令(参数1 参数2) # 参数之间用空格或分号有关

对大小写敏感
add(a a.cpp)
ADD(a a.cpp)

变量方式用${}方式取值,但是在if语句中直接使用变量名

set(HELLO hello.cpp)
add(hello ${HELLO})

if(HELLO)

6.3 重要指令和CMake常用变量

重要指令

  1. cmake_minimum_required 指定CMake最小版本要求
cmake_minimum_required(VERSION version_number[fatal error])

# CMake最小版本要求为2.8.3
cmake_minimum_required(VERSION 2.8.3)
  1. project 指定工程名称,并可指定工程支持的语言
project(project_name[CXX][C][Java])

# 指定工程名为HELLOWORLD
project(helloworld)
  1. set 显示定义的变量
set(VAR [VALUE][CACHE TYPE DOCSTRING [FORCE]])

# 定义SRC变量,其值为sayhello.cpp hello.cpp
set(SRC sayhello.cpp hello.cpp)
  1. include_directories - 向工程添加多个特定的头文件搜索路径
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径
include_directories(/usr/include/myincludefolder ./include)
  1. link_directories - 向工程添加多个特定的库文件搜索路径
link_directories(dir1 dir2 ...)

# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib)
  1. add_library - 生成库文件
add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)

SHARED 动态库
STATIC 静态库

# 通过变量 SRC 生成 libhello.so 共享库
add_library(hello SHARED ${SRC})
  1. add_compile_options - 添加编译参数
# 添加编译参数 -Wall -std=c++11 -O2
add_compile_options(-Wall -std=c++11 -O2)
  1. add_executable - 生成可执行文件
add_executable(exename source1 source2 ... sourceN)

# 编译main.cpp生成可执行文件main
add_executable(main main.cpp)

CMake 常用变量

CMAKE_CXX_FLAGS g++编译选项

# 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

CMAKE_BUILD_TYPE 编译类型(Debug, Release)

# 设定编译类型为debug,调试时需要选择debug
set(CMAKE_BUILD_TYPE Debug)
# 设定编译类型为release,发布时需要选择release
set(CMAKE_BUILD_TYPE Release)

6.4 CMake编译工程

CMake目录结构:项目主目录存在一个CMakeLists.txt文件

两种方式设置编译规则:

  1. 包含源文件的子文件夹包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory
    添加子目录即可;
  2. 包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的
    CMakeLists.txt中;

编译流程:

  1. 手动编写 CMakeLists.txt
  2. 执行命令 cmake PATH 生成 Makefile ( PATH 是顶层CMakeLists.txt 所在的目录 )
  3. 执行命令 make 进行编译

tips:

. #当前目录
./ #当前目录

.. #上级目录
../ #上级目录

两种构建方式

  1. 内部构建

  2. 外部构建(out-of-source build):推荐使用

将编译输出文件与源文件放到不同目录中

## 外部构建
# 1. 在当前目录下,创建build文件夹
mkdir build
# 2. 进入到build文件夹
cd build
# 3. 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ..
# 4. 执行make命令,生成target
make

6.5 实战

7 实战: 使用VSCode进行完整项目开发

7.1 合理设置项目目录

头文件,源文件等分开存放

#pragma once
在.h文件开头写,防止该头文件被重复包含

it's a preprocessor directive in the C and C++ programming languages. It is used to ensure that a header file is included only once during a compilation process

7.5 调试项目

  1. 配置json文件:
create a launch.json file

program: 调试文件的绝对路径

preLaunchTask: 调试之前的task

把launch.json 中的preLaunchTasks的值替换成 task.json中所要执行任务的label(build),即可实现自动化编译,不用手动每次camke 和 make

reference source: https://www.bilibili.com/video/BV1fy4y1b7TC?p=23&vd_source=2d6cee579dad6888d21e19ecdb04b579

Logo

更多推荐