本文的内容
参考如下内容。
1.【基于VSCode和CMake实现C/C++开发 | Linux篇】https://www.bilibili.com/video/BV1fy4y1b7TC?vd_source=0ddb24a02523448baa69b0b871ab50f7
2.Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.
3.关于如何利用vscode 包含.h 文件的问题_vscode怎么引入自定义头文件-CSDN博客
4. linux系统03--makefile文件,gdb 以及文件描述符_cat_fish_rain的博客-CSDN博客
5.linux 系统中vi 编辑器和库的制作和使用02_cat_fish_rain的博客-CSDN博客
第一讲:
什么是linux系统?
- Linux是开源的操作系统
多用户多任务:
- 单用户:一个用户,在登录计算机(操作系统),只能允许同时登录一个用户;
- 单任务:一个任务,允许用户同时进行的操作任务数量;
- 多用户:多个用户,在登录计算机(操作系统),允许同时登录多个用户进行操作;
- 多任务:多个任务,允许用户同时进行多个操作任务;
Windows属于:单用户、多任务。
Linux属于:多用户、多任务。
Linux一切皆文件
对于文件的操作的都有哪些种类?
- 创建文件、编辑文件、保存文件、关闭文件、重命名文件、删除文件、恢复文件
-
1.1 目录结构
目录结构:
- **Bin:**全称binary,含义是二进制。该目录中存储的都是一些二进制文件,文件都是可以被运行的。
- Dev:该目录中主要存放的是外接设备,例如盘、其他的光盘等。在其中的外接设备是不能直接被使用的,需要挂载(类似window下的分配盘符)。
- **Etc:**该目录主要存储一些配置文件。
- Home:表示“家”,表示除了root用户以外其他用户的家目录,类似于windows下的User/用户目录。
- **Proc:**全称process,表示进程,该目录中存储的是Linux运行时候的进程。**Root:**该目录是root用户自己的家目录。**Sbin:**全称super binary,该目录也是存储一些可以被执行的二进制文件,但是必须得有super权限的用户才能执行。**Tmp:**表示“临时”的,当系统运行时候产生的临时文件会在这个目录存着。
- **Usr:**存放的是用户自己安装的软件。类似于windows下的program files。
- **Var:**存放的程序/系统的日志文件的目录。
- **Mnt:**当外接设备需要挂载的时候,就需要挂载到mnt目录下。
1.2 指令与选项
- 指令含义:
- Linux的指令是指在Linux**终端(命令行)**中输入的内容。
- 指令格式:
- 完整指令的标准格式:命令(空格) [选项](空格) [操作对象]
- 选项和操作对象都可以没有,也可以是多个
# 指令示例:以下两条指令等价
ls -l -a -h /home ./
ls -lah /home ./
1.3 重要指令讲解 +【实战】命令行
- pwd - Print current working directory
- **作用:**打印当前终端所在的目录
- 用法: pwd
# 打印当前目录
pwd
- ls - List directory contents
-
**作用:**列出当前工作目录下的所有文件/文件夹的名称
-
用法1:ls
**含义:**列出当前工作目录下的文件/文件夹的名称
-
ls
-
-
用法2:ls [路径]
含义:列出指定路径下的所有文件/文件夹的名称
- 绝对路径:相对根目录的路径;
- 相对路径:相对当前目录的路径;
- # ls 相对路径
ls ./ #【表示当前目录下】
ls ../ #【上一级目录下】
# ls 绝对路径
ls /home
# ls 相对路径ls ./ # 【表示当前目录下】ls ../ # 【上一级目录下】# ls 绝对路径ls /home
# ls 选项 路径ls -lah /home# 选项解释:-l :表示 list ,表示以详细列表的形式进行展示-a :表示显示所有的文件 / 文件夹(包含了隐藏文件 / 文件夹)-h :表示以可读性较高的形式显示# ls -l 中 “-” 表示改行对应的文档类型为文件, “d” 表示文档类型为文件夹。# 在 Linux 中隐藏文档一般都是以 “.” 开头
# 以下两条命令等价,示直接进入当前用户的家目录下【很常用】cdcd ~
用法2:cd [相对路径]
# 进入到上级目录下cd ..# 进入到上级目录中的 local 目录下cd ../local
用法3:cd [绝对路径]
# 进入到 /usr/local 目录下cd /usr/local
# 在当前路径下创建出目录 “myfolder”mkdir myfolder
# 创建 ~/a/b/c 目录mkdir -p ~/a/b/c
# 在当前目录分别创建 a 、 b 、 c 三个文件夹mkdir a b c
-----------------------------------------------------------------------------------------------------# 【为什么创建新文件是 touch 】# 1. touch 的作用本来不是创建文件,而是将指定文件的修改时间设置为当前时间。就是假装 “ 碰 ” ( touch )了一下这个文件,假装文件被 “ 修改 ” 了,于是文件的修改时间就是被设置为当前时间。# 2. 这带来了一个副作用,就是当 touch 一个不存在的文件的时候,它会创建这个文件。然后,由于 touch 已经可以完成创建文件的功能了,就不再需要一个单独的 create 了。-----------------------------------------------------------------------------------------------------
用法1:touch [路径]
# 在当前目录下创建 linux.txt 文件touch linux.txt# 在上级目录下创建 linux 文件touch ../linux# 在 /home/bing/ 目录下创建 myfile 文件touch /home/bing/myfile
用法2:touch [路径1] [路径2]
# 在当前目录下创建 file file.txt两个文件touch file file.txt
# 删除当前路径下的 myfile 文件rm myfile# 删除 /usr 路径下的 myfile 文件rm /usr/myfile
用法2:rm [选项] 需要移除的目录
# 删除当前路径下的 abc 文件rm -rf myfolder# 删除 /usr 路径下的 abc 文件rm -rf /usr/myfolder
cp - copy files and directories
# cp 命令来复制一个文件cp /home/bing/myfile ./
# 复制 /home/bing/myfolder 文件夹到根目录 / 下cp -r /home/bing/myfolder /
# 移动当前目录下 myfile 文件到根目录 / 下mv myfile /myfile# 移动当前目录下 myfolder 文件夹到根目录 / 下mv myfolder /myfolder# 移动当前目录下 myfile 到根目录 / 下,并重命名为 myfile007mv myfile myfile007
# 查看 ls 命令的手册man ls# 查看 cd 命令的手册man cd# 查看 man 命令的手册man man
# 立即重启reboot
# 立即关机shutdown -h now
1.4 文件编辑
第二讲:开发环境搭建
sudo apt update
# 通过以下命令安装编译器和调试器
sudo apt install build-essential gdb
安装成功确认
# 以下命令确认每个软件是否安装成功# 如果成功,则显示版本号gcc --versiong ++ --versiongdb --version
2.2 CMake安装
# 通过以下命令安装编译器和调试器
sudo apt install cmake
安装成功确认
# 确认是否安装成功# 如果成功,则显示版本号cmake --version
第三讲:GCC编译器
# -E 选项指示编译器仅对输入文件进行预处理
g++ -E test.cpp -o test.i //.i文件
# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译
# g++ 产生的汇编语言文件的缺省扩展名是 .s
g++ -S test.i -o test.s
# -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码
# 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。
g++ -c test.s -o test.o
# -o 编译选项来为将产生的可执行文件用指定的文件名
g++ test.o -o test
3.2 g++重要编译参数
# -g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息,以调试程序。
# 产生带调试信息的可执行文件test
g++ -g test.cpp
## 所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。# -O 选项告诉 g++ 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2选项告诉 g++ 产生尽可能小和尽可能快的代码。 如 -O2 , -O3 , -On ( n 常为 0–3 )# -O 同时减小代码的长度和执行时间,其效果等价于 -O1# -O0 表示不做优化# -O1 为默认优化# -O2 除了完成 -O1 的优化之外,还进行一些额外的调整工作,如指令调整等。# -O3 则包括循环展开和其他一些与处理特性相关的优化工作。# 选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。# 使用 -O2 优化源代码,并输出可执行文件g ++ -O2 test.cpp
# -l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名
# 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接
# 链接glog库
g++ -lglog test.cpp
# 如果库文件没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录
# -L参数跟着的是库文件所在的目录名
# 链接mytest库,libmytest.so在/home/bing/mytestlibfolder目录下
g++ -L/home/bing/mytestlibfolder -lmytest test.cpp
# -I
# /usr/include目录一般是不用指定的,gcc知道去那里找,但 是如果头文件不在/usr/icnclude
里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-
I/myinclude 参数了,如果不加你会得到一个”xxxx.h: No such file or directory”的错
误。-I参数可以用相对路径,比如头文件在当前 目录,可以用-I.来指定。上面我们提到的–cflags参
数就是用来生成-I参数的。
g++ -I/myinclude test.cpp
5. -Wall 打印警告信息
# 打印出gcc提供的警告信息
g++ -Wall test.cpp
# 关闭所有警告信息
g++ -w test.cpp
# 使用 c++11 标准编译 test.cpp
g++ -std=c++11 test.cpp
# 指定即将产生的文件名
# 指定输出可执行文件名为test
g++ test.cpp -o test
# 在使用gcc/g++编译的时候定义宏
# 常用场景:
# -DDEBUG 定义DEBUG宏,可能文件中有DEBUG宏部分的相关信息,用个DDEBUG来选择开启或关闭
DEBUG
// -Dname 定义宏name,默认定义内容为字符串“1”
#include <stdio.h>
int main()
{#ifdef DEBUGprintf("DEBUG LOG\n");#endifprintf("in\n");
}
// 1. 在编译的时候,使用gcc -DDEBUG main.cpp
// 2. 第七行代码可以被执行
3.3 【实战】g++命令行编译
案例:最初目录结构: 2 directories, 3 files
# 最初目录结构.├── include│ └── Swap.h├── main.cpp└── src└── Swap.cpp2 directories, 3 files
3.3.1 直接编译
# 将 main.cpp src/Swap.cpp 编译为可执行文件
g++ main.cpp src/Swap.cpp -Iinclude
# 运行a.out
./a.out
# 将 main.cpp src/Swap.cpp 编译为可执行文件 附带一堆参数
g++ main.cpp src/Swap.cpp -Iinclude -std=c++11 -O2 -Wall -o b.out
# 运行 b.out
./b.out
3.3.2 生成库文件并编译
链接静态库生成可执行文件①:
## 进入src目录下
$cd src
# 汇编,生成Swap.o文件
g++ Swap.cpp -c -I../include
# 生成静态库libSwap.a
ar rs libSwap.a Swap.o
## 回到上级目录
$cd ..
# 链接,生成可执行文件:staticmain
g++ main.cpp -Iinclude -Lsrc -lSwap -o staticmain
## 进入src目录下
$cd src
# 生成动态库libSwap.so
g++ Swap.cpp -I../include -fPIC -shared -o libSwap.so
## 上面命令等价于以下两条命令
# gcc Swap.cpp -I../include -c -fPIC
# gcc -shared -o libSwap.so Swap.o
## 回到上级目录
$cd ..
# 链接,生成可执行文件:sharemain
g++ main.cpp -Iinclude -Lsrc -lSwap -o sharemain
3.3.3 运行可执行文件
运行可执行文件①
# 运行可执行文件
./staticmain
# 运行可执行文件
LD_LIBRARY_PATH=src ./sharemain