1 Linux系统
多用户、多任务
(1) 目录结构:
bin:可执行文件
dev:外接设备,盘、光盘等,其中外接设备不能被直接使用
etc:存储配置文件
home:除了root用户以外的其它用户的家目录,类似于windows的user
proc:表示进程,存放Linux运行时存放的进程
sbin:super binary super权限下的可执行文件
tmp:系统运行时存放的临时文件
usr:存放用户自己安装的软件,类似于Windows的program files
var:存放程序/系统的日志
mnt:外接设备挂载的目录
(2) 指令
标准格式:命令(空格)[选项](空格)[操作对象]
(3) 重要指令
pwd;打印当前目录
ls [路径] ;列出当前指定路径下所有文件/文件夹的名称
ls 相对路径:ls ./表示当前目录下;ls ../上一级目录
ls绝对路径:ls /
ls 选项:-l 以详细列表展示;-a显示所有文件/文件夹(包括隐藏问价.filename);h可读性较高的形式表示
cd :切换目录
cd 相对路径:cd ..;进入上级目录
cd [绝对路径] 进入绝对路径下
mkdir 路径;在当前目录下创建目录
mkdir -p 路径;一次创建多层不存在的目录 mkdir -p -/a/b/c
mkdir 路径1 路径2 ...;当前目录下分别创建多个目录 mkdir a b c
touch 创建文件(若文件存在则改变文件的修改时间);touch 路径
rm 删除目录/文件;删除文件 :rm 文件;删除目录: rm -rf 目录
cp 复制文件/文件夹到指定位置;cp 复制路径 指定路径
cp -r 文件夹路径,递归复制文件夹
mv 移动文件到新的位置/重命名文件;mv 文件路径 目标路径/新名字
man 包含了linux中全部命令的手册;man 命令 ;按q退出
help 指令;查看指令信息
reboot 重启;
shutdown - h 时间;关机;
df -h 查看内存占用情况
sudo chmod -R 777 目录 ;将目录下文件和子目录权限设置为可读可写可执行
查看软件安装位置:whereis 软件名
ps命令:查看进程情况
kill命令:向进程发送终止信号
tar命令:对文件进行打包,调用gzip或bzip对文件进行压缩或解压
cat命令:查看文件内容,与less、more功能相似
top命令:可以查看操作系统的信息,如进程、CPU占用率、内存信息等
grep命令:该命令常用于分析一行的信息,若当中有我们所需要的信息,就将该行显示出来,该命令通常与管道命令一起使用,用于对一些命令的输出进行筛选加工。
(4) 文件编辑
Vim[file] :Vim编辑器:程序开发、文件编辑,有三种模式 :i 输入
用法1:vim 文件名(有时权限不足可使用:sudo vim 文件名) ;进入文件后输入模式;在该模式下操作;保存:按Esc退出该模式,按住shift+:输入w;退出:shift+:输入q
gedit[file]:Linux下的纯文本编辑器;可以根据不同语言高亮显示关键字和标识符
nano[file]:比较小巧的编辑器,比Vim简单
(5) 环境搭建
安装 g++\gcc 、gdb:
sudo apt update
sudo apt install build-essential gdb
安装 cmake:sudo apt cmake
确认安装:gcc --version
2 g++编译过程
预处理:对输入文件预处理:g++ - E test.cpp -o test.i
编译:产生汇编语言文件 : g++ -S test.i -o test.s
汇编:编译源代码为机器语言:g++ -C test.s -o test.o
链接:产生可执行的文件名:g++ test.o -o test
(1) g++重要的编译参数
g++ -g 输入文件 -o 输出文件:产生带调试信息的可执行文件(产生能被GDB使用的调试信息)
g++ -O[n]优化源代码(如省略代码中未使用的变量、将常量表达式用结果值代替等减小代码量提高最终生成的文件运行效率的操作); n=0/1/2/3;0不做优化,1默认优化,2在1的基础上调整,3循环展开一些与处理相关的优化工作;常用 -O2
g++ -l/L:指定程序要链接的库;在/lib和/usr/lib和/usr/local/lib下的库直接使用:-l库名,否则要使用:-L路径 -l库名;小写l指定要链接的库名,L指定库所在的目录路径
g++ -L/home/myfile -ltests test.cpp;要链接的库tests
g++ -I(大写I)路径:寻找头文件不在/usr/include下的程序所需头文件
g++ -Wall 程序 ;打印程序警告信息
g++ -w 程序 ;关闭程序警告信息
g++ -std==c++11 程序;设置编译标准
g++ 程序 -o 新名字;指定输出名;不加-o 默认输出为a.out文件
g++ -DDEBUG 程序(选择开启或关闭宏);编译时定义宏
man gcc查看手册
(2) gdb 调试器(GNU Debugger)
g++编译时加上:-g才能使用gdb调试:g++ -g 程序
vscode 通过调用gdb调试器进行调试;
gdb主要功能:设置断点(可以是条件表达式)、使程序在指定代码上暂停执行、单步执行、产看程序中变量值变化、动态改变程序执行环境、分析崩溃程序产生的core文件
用法:调试开始 gdb[可执行文件]
常用命令:run(可缩写为r)重新开始运行
break+num(b):在num行设置断点
delete breakpoints[n]:删除第n个断点
enable breakpoints :启用断点
disable breakpoints :禁用断点
list(l):查看源代码
start:单步执行,停在第一句,等待命令
next(n):单步执行(逐过程)
step(s):单步执行(逐语句)
finish:结束当前函数返回到函数调用点
info(i):查看程序内部局部变量的数值
continue(c):继续运行
print(p):打印值及地址
display:追踪查看具体变量的值,每一步都会打印
watch:被设置的观察点发生修改时,打印显示
quit(q):退出gdb
回车键代表重复上一命令
3 cmake
CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。
(1)常用语法:基本语法:指令(参数 1 参数 2…) ;指令是大小写无关的,参数和变量是大小写相关的
cmake_minimum_required - 指定CMake的最小版本要求
cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])
project - 定义工程名称,并可指定工程支持的语言
project(projectname [CXX] [C] [Java])
set - 显式的定义变量
set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
link_directories - 向工程添加多个特定的库文件搜索路径 --->相当于指定g++编译器的-L参数
link_directories(dir1 dir2 …)
add_library - 生成库文件
add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
add_compile_options - 添加编译参数
add_compile_options(-Wall -std=c++11 -O2)添加编译参数 -Wall -std=c++11
add_executable - 生成可执行文件
add_executable(main main.cpp)编译main.cpp生成可执行文件main
target_link_libraries - 为 target 添加需要链接的共享库 --->相同于指定g++编译器-l参数
target_link_libraries(main hello)将hello动态库文件链接到可执行文件main
add_subdirectory - 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
add_subdirectory(src)添加src子目录,src中需有一个CMakeLists.txt
aux_source_directory - 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
aux_source_directory(. SRC)定义SRC变量,其值为当前目录下所有的源代码文件
add_executable(main ${SRC})编译SRC变量所代表的源代码文件,生成main可执行文件
(2)常用变量
CMAKE_CXX_FLAGS g++编译选项
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11
CMAKE_BUILD_TYPE 编译类型(Debug, Release)
set(CMAKE_BUILD_TYPE Debug) 设定编译类型为debug,调试时需要选择debug
set(CMAKE_BUILD_TYPE Release) 设定编译类型为release,发布时需要选择release
CMAKE_BINARY_DIR、PROJECT_BINARY_DIR、<projectname>__BINARY_DIR
三个变量指代的内容是一致的。
如果是 in source build,指的就是工程顶层目录。
如果是 out-of-source 编译,指的是工程编译发生的目录。
CMAKE_SOURCE_DIR、PROJECT_SOURCE_DIR、<projectname>__SOURCE_DIR
三个变量指代的内容是一致,都是工程顶层目录。
在 in source build时,他跟 CMAKE_BINARY_DIR 等变量一致
CMAKE_CXX_COMPILER:指定C++编译器
EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径
LIBRARY_OUTPUT_PATH:库文件输出的存放路径
(3)CMake编译工程
CMake目录结构:项目主目录存在一个CMakeLists.txt文件
两种方式设置编译规则
-
包含源文件的子文件夹包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录即可;
-
包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中
编译流程
在 linux 平台下使用 CMake 构建C/C++工程的流程如下
手动编写 CmakeLists.txt。
执行命令 cmake PATH
生成 Makefile ( PATH 是顶层CMakeLists.txt 所在的目录 )。
执行命令make
进行编译
两终构建方式:
内部构建(in-source build):不推荐使用
## 内部构建
# 在当前目录下,编译本目录的CMakeLists.txt,生成Makefile和其他文件
cmake .
# 执行make命令,生成target
make
外部构建(out-of-source build):==推荐使用==
将编译输出文件与源文件放到不同目录中
# 1. 在当前目录下,创建build文件夹
mkdir build
# 2. 进入到build文件夹
cd build
# 3. 编译上级目录的CMakeLists.txt,生成Makefile和其他文件
cmake ..
# 4. 执行make命令,生成target
make简单的CMakeLists.txt编写
cmake_minimum_required(VERSION 3.22)
project(SWAP)include_directories(include)
add_executable(main_cmake main.cpp src/swarp.cpp)