导图社区 基于VSCode和CMake实现CC开发 Linux
这是一篇关于基于VSCode和CMake实现CC开发 Linu的思维导图,主要内容包括:常用指令,GCC编译器,GDB调试器,目录结构,VS Code,CMake。
编辑于2025-03-28 11:01:37这是一篇关于十二月计划(11.29-12.31)的思维导图,主要内容包括:计划,目标,每日任务,调整。通过系统的学习和积累,提升各科成绩。
这是一篇关于十一月计划11.1-11.30的思维导图,主要内容包括:计划,目标,每日任务(1 2),调整。通过系统的学习和积累,提升各科成绩,
"十月冲刺计划:高效突破薄弱项,稳步提升各科成绩!我的1031031计划围绕三大核心:主科巩固与理科强化。数学主攻函数和不等式英语每天过单词 续写训练,目标120分物理专练步步高十个专题,冲刺75分生物通过试卷打卡突破80分。技术科目保持85分,语文利用零碎时间积累素材。每日固定任务包括国师第二阶段、英语3500词、续写素材收集,同时兼顾语文课、演讲等校园事务。时间管理上注重排队、早饭前等碎片化利用。
社区模板帮助中心,点此进入>>
这是一篇关于十二月计划(11.29-12.31)的思维导图,主要内容包括:计划,目标,每日任务,调整。通过系统的学习和积累,提升各科成绩。
这是一篇关于十一月计划11.1-11.30的思维导图,主要内容包括:计划,目标,每日任务(1 2),调整。通过系统的学习和积累,提升各科成绩,
"十月冲刺计划:高效突破薄弱项,稳步提升各科成绩!我的1031031计划围绕三大核心:主科巩固与理科强化。数学主攻函数和不等式英语每天过单词 续写训练,目标120分物理专练步步高十个专题,冲刺75分生物通过试卷打卡突破80分。技术科目保持85分,语文利用零碎时间积累素材。每日固定任务包括国师第二阶段、英语3500词、续写素材收集,同时兼顾语文课、演讲等校园事务。时间管理上注重排队、早饭前等碎片化利用。
基于VSCode和CMake实现C/C++开发 | Linux篇
常用指令
ctrl+alt+t快捷打开终端 ctrl+l清屏 用上下左右的上可以复制粘贴上一步
pwd
打印当前终端所在的目录
Print current working directory
ls
List directory contents
列出当前工作目录下的文件/文件名的名称
用法一
列出当前工作目录下的文件/文件夹的名字
用法二
ls+路径
相对路径
ls ./
表示当前目录下
ls ../
上一级目录下
绝对路径
ls /home
用法三
ls+选项
在列出指定路径下的文件/文件夹的名字,并以指定格式显示
ls -lah /home
-l
表示list,表示以详细列表的形式进行展示
-a
表示显示所有的文件/文件夹(包含了隐藏文件/文件夹)
-h
表示以可读性较高的形式显示
注意
输出的名字里面以d开头的是文件夹,以-开头的是文件
cd
change directory
切换当前工作目录
用法一
cd和cd~
表示直接进入当前用户的家目录下
用法二
cd+路径
cd+相对路径
cd ..
进入上级目录
cd ../local
进入上级目录中的local目录下
cd+绝对路径
cd /usr/local
mkdir
make directories
创建目录
用法一
在当前目录下创建出目录
用法二
mkdir -p路径
一次性创建多层不存在的目录
mkdir -p ~/a/b/c
创了一个a包含b b包含c的目录
用法三
mkdir 路径1 路径2
一次性创建多个目录
tree
tree和ls是用于查看目录结构和文件列表的命令,但它们有一些区别。 1. 输出方式: - ls命令以列表的形式显示目录中的文件和子目录的名称。 - tree命令以树形结构的形式显示目录中的文件和子目录的名称。 2. 层级显示: - ls命令只显示当前目录中的文件和子目录,不会递归显示子目录中的内容。 - tree命令可以递归显示目录树,包括所有子目录和文件。 3. 文件详细信息: - ls命令可以显示文件的详细信息,如权限、大小、修改日期等。 - tree命令只显示文件和目录的名称,不显示详细信息。 综上所述,ls适用于快速查看当前目录的文件和子目录,而tree更适用于查看整个目录树结构。具体使用哪个命令取决于你想要查看什么信息和展示方式。
touch
change file timestamps
创建新文件
[为什么创建新文件是touch] # 1.touch的作用本来不是创建文件,而是将指定文件的修改时间设置为当前时间。就是假装“碰”(touch)了一下这个文件,假装文件被“修改"了,于是文件的修改时间就是被设置为当前时间。 # 2,这带来了一个副作用,就是当touch一个不存在的文件的时候,它会创建这个文件。然后、由于touch已经可以完成创建文件的功能了,就不再需要一个单独的create了。
比如touch linux,txt
touch ,,/linux
touch /home/alex/myfile
rm
remove files or directories
删除文件/目录
rm file01删除file01这个文件
rm -rf a删除a这个目录
cp
copy files or directories
复制文件/文件夹到指定的位置
复制文件
cp /home/alex/myfile /home/alex/c
复制目录
cp -r cp /home/alex/myfolder /home/alex/c
mv
move(rename) files
移动文件到新位置或者重命名文件
man
an interface to the system reference manuals
包含了Linux中全部命令手册
或者用help
用了 man ls之后
按q退出
reboot
reboot the machine
重启linux系统
shutdown
power-off the machine
关机
可以加时间比如说 shutdown -h now
vim/nano/gedit 文件名
文件编辑
GCC编译器
编译过程
G++重要编译参数
-g
编译带调试信息的可执行文件
-O
优化源代码,基本上使用O2优化
g++ -O2 test.cpp
-l
-l和-L指定库文件|指定库文件路径
#链接mytest库, libmytest ..so在/home/ bing/mytestlibfolder目录下 g++ -L/home/bing/mytestlibfolder -lmytest: test.cpp
当你在城市中行走时,你可能会看到一些标志指向各种有趣的地方,如博物馆、剧院等。这些标志就像是各个库文件,它们提供了特定的功能或资源供你使用。而 "-l" 就像是你决定参观其中一个地方的选择。你可以根据标志上的名称选择要参观的地方,然后进去欣赏和体验那里的内容。
-i
当你进入一个陌生的城市时,你可以将 "-i" 想象成告诉出租车司机你要去的目的地的地址,这样司机就知道要把你送到哪里。
指定头文件搜索目录
-Wall
打印警告信息
g++ -Wall test.cpp
-w
关闭警告信息
-std=c++11
设置编译标准
g++ -std=c++11 test.cpp
-o
指定输出文件名
g++ test.cpp -o test
默认输出.out的可执行文件
-D
定义宏
GDB调试器
主要功能
设置断点 (断点可以是条件表达式)
使程序在指定的代码行上暂停执行,便于观察
单步执行程序,便于调试
查看程序中变量值的变化
动态改变程序的执行环境
分析崩溃程序产生的core文件
相关信息
GDB(GNU Debugger)是一个用来 调试C/C++程序 的功能强大的 调试器 ,是Linux系统开发C/C++最常用的调试器
程序员可以使用GDB来跟踪程序中的错误 ,从而减少程序员的工作量。
Linux 开发C/C++ 一定要熟悉 GDB
VSCode是通过调用GDB调试器来实现C/C++的调试工作的;
常用调试命令参数(括号内表示可简写)
gdb 【exefilename】
调试开始,进入gdb调试程序,其中exefilename为要调试的可执行文件名
help (h) # 查看命令帮助,具体命令查询在gdb中输入help + 命令
run (r) # 重新开始运行文件
start # 单步执行,运行程序,停在第一行执行语句
list (l) # 查看原代码
显示了13行上下五行
set # 设置变量的值
next (n) # 单步调试(逐过程,函数直接执行)
step (s) # 单步调试(逐语句:跳入自定义函数内部执行)
backtrace (bt) # 查看函数的调用的栈帧和层级关系
frame (f) # 切换函数的栈帧
info (i) # 查看函数内部局部变量的数值
finish # 结束当前函数,返回到函数调用点
continue (c) # 继续运行
print (p) # 打印值及地址
quit (q) # 退出gdb
break+num (b) # 在第num行设置断点
info breakpoints # 查看当前设置的所有断点
delete breakpoints num (d) # 删除第num个断点
display # 追踪查看具体变量值
undisplay # 取消追踪观察变量
watch # 被设置观察点的变量发生修改时,打印显示
i watch # 显示观察点
enable breakpoints # 启用断点
disable breakpoints # 禁用断点
x # 查看内存x/20xw 显示20个单元,16进制,4字节每单元
run argv[1] argv[2] # 调试时命令行传参
set follow-fork-mode child # 选择跟踪父子进程(fork())
注意
编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o main
回车键:重复上一命令
案例源码
1 #include <iostream> 2 using namespace std; 3 4 int main(int argc,char **argv) 5 { 6 int N = 100; 7 int sum = 0; 8 int i=1; 9 10 // calculate sum from 1 to 100 11 while (i <= N) 12 { 13 sum = sum + i; 14 i = i + 1; 15 } 16 17 cout << "sum = " << sum << endl; 18 cout << "The program is over." << endl; 19 20 return 0; 21 } 22
目录结构
Bin:全称binary,含义是二进制。该目录中存储的都是一些二进制文件,文件都是可以被运行的。
Home: 表示“家”,表示除了root用户以外其他用户的家目录,类似于windows下的User/用户目录
Root: 该目录是root用户自己的家目录。
初学需掌握
Dev: 该目录中主要存放的是外接设备,例如盘、其他的光盘等。在其中的外接设备是不能直接被使用的,需要挂载 (类似window下的分配盘符)
Etc:该目录主要存储一些配置文件。
Proc: 全称process,表示进程,该目录中存储的是Linux运行时候的进程。
Sbin: 全称super binary,该目录也是存储一些可以被执行的二进制文件,但是必须得有super权限的用户才能执行。
Tmp:表示”临时”的,当系统运行时候产生的临时文件会在这个目录存着
Usr:存放的是用户自己安装的软件。类似于windows下的program files。
Var:存放的程序/系统的日志文件的目录。
Mnt:当外接设备需要挂载的时候,就需要挂载到mnt目录下。
VS Code
快捷键
转到文件/其他常用操作
Ctrl+p
直接输入文件名,跳转到文件 ? 列出当前可执行的动作 ! 显示 Errors或 Warnings,也可以 Ctrl+Shift+M : 跳转到行数,也可以 Ctrl+G 直接进入 @ 跳转到 symbol(搜索变量或者函数),也可以 Ctrl+Shift+O 直接进入 @ 根据分类跳转 symbol,查找属性或函数,也可以 Ctrl+Shift+O 后输入:进入 # 根据名字查找 symbol,也可以 Ctrl+T
高频使用快捷键
打开命令面板
Ctrl+Shift+P
打开终端
Ctrl+
关闭侧边栏
Ctrl+B
保存文件
Ctrl+S
关闭当前文件
Ctrl+w
当前行上移或者下移
Alt+up/down
变量统一重命名
F2
转到定义处
F12
编辑器与窗口管理
打开一个新窗口:Ctrl+Shift+N 关闭窗口:Ctrl+Shift+W 同时打开多个编辑器(查看多个文件) 新建文件 Ctrl+N 文件之间切换 Ctrl+Tab 切出一个新的编辑器(最多 3 个) Ctrl+\,也可以按住 Ctrl 鼠标点击 Explorer 里的文件名 左中右 3 个编辑器的快捷键 Ctrl+1 Ctrl+2 Ctrl+3 3 个编辑器之间循环切换 Ctrl+ 编辑器换位置, Ctrl+k然后按 Left或 Right
查找替换
查找 Ctrl+F 查找替换 Ctrl+H 整个文件夹中查找 Ctrl+Shift+F
显示相关
全屏:F11 zoomIn/zoomOut:Ctrl +/- 侧边栏显/隐:Ctrl+B 显示资源管理器 Ctrl+Shift+E 显示搜索 Ctrl+Shift+F 显示 Git Ctrl+Shift+G 显示 Debug Ctrl+Shift+D 显示 Output Ctrl+Shift+U
重构代码
找到所有的引用:Shift+F12 同时修改本文件中所有匹配的:Ctrl+F12 重命名:比如要修改一个方法名,可以选中后按 F2,输入新的名字,回车,会发现所有的文件都修改了 跳转到下一个 Error 或 Warning:当有多个错误时可以按 F8 逐个跳转 查看 diff:在 explorer 里选择文件右键 Set file to compare,然后需要对比的文件上右键选择 Compare with file_name_you_chose
格式调整
代码行缩进 Ctrl+[ 、 Ctrl+] Ctrl+C 、 Ctrl+V 复制或剪切当前行/当前选中内容 代码格式化:Shift+Alt+F,或 Ctrl+Shift+P 后输入 format code 上下移动一行:Alt+Up 或 Alt+Down 向上向下复制一行:Shift+Alt+Up 或 Shift+Alt+Down 在当前行下边插入一行 Ctrl+Enter 在当前行上方插入一行 Ctrl+Shift+Enter
光标相关
移动到行首:Home 移动到行尾:End 移动到文件结尾:Ctrl+End 移动到文件开头:Ctrl+Home 移动到定义处:F12 定义处缩略图:只看一眼而不跳转过去 Alt+F12 移动到后半个括号:Ctrl+Shift+] 选择从光标到行尾:Shift+End 选择从行首到光标处:Shift+Home 删除光标右侧的所有字:Ctrl+Delete 扩展/缩小选取范围:Shift+Alt+Left 和 Shift+Alt+Right 多行编辑(列编辑):Alt+Shift+鼠标左键,Ctrl+Alt+Down/Up 同时选中所有匹配:Ctrl+Shift+L Ctrl+D 下一个匹配的也被选中 (在 sublime 中是删除当前行,后面自定义快键键中,设置与 Ctrl+Shift+K 互换了) 回退上一个光标操作:Ctrl+U
两个项目
CMake
前言
CMake是一个 跨平台 的安装 编译工具 ,可以用 简单 的语句来描述 所有平台 的安装(编译过程)。
CMake可以说已经成为大部分C++开源项目标配
Cross-platform development
语法特性介绍
基本语法格式:指令(参数 1 参数 2…)
参数使用
括弧 括起
参数之间使用
空格 或 分号 分开
指令是大小写无关的,参数和变量是大小写相关的
1set(HELLO hello.cpp) 2add_executable(hello main.cpp hello.cpp) 3ADD_EXECUTABLE(hello main.cpp ${HELLO})
变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名
重要指令和CMake常用变量
重要指令
cmake_minimum_required- 指定CMake的最小版本要求
1# CMake最小版本要求为2.8.3 2cmake_minimum_required(VERSION 2.8.3)
语法:
cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])
project- 定义工程名称,并可指定工程支持的语言
1# 指定工程名为HELLOWORLD 2project(HELLOWORLD)
project(projectname [CXX] [C] [Java])
set- 显式的定义变量
1# 定义SRC变量,其值为main.cpp hello.cpp 2set(SRC sayhello.cpp hello.cpp)
set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
include_directories - 向工程添加多个特定的头文件搜索路径--->相当于指定g++编译器的-I参数
1# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径 2include_directories(/usr/include/myincludefolder ./include)
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)
link_directories- 向工程添加多个特定的库文件搜索路径 --->相当于指定g++编译器的-L参数
1# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径 2link_directories(/usr/lib/mylibfolder ./lib)
语法:link_directories(dir1 dir2 …)
add_library- 生成库文件
1# 通过变量 SRC 生成 libhello.so 共享库 2add_library(hello SHARED ${SRC})
add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
add_compile_options- 添加编译参数
1# 添加编译参数 -Wall -std=c++11 2add_compile_options(-Wall -std=c++11 -O2)
add_compile_options(
add_executable- 生成可执行文件
1# 编译main.cpp生成可执行文件main 2add_executable(main main.cpp)
add_library(exename source1 source2 … sourceN)
target_link_libraries- 为 target 添加需要链接的共享库 --->相同于指定g++编译器-l参数
1# 将hello动态库文件链接到可执行文件main 2target_link_libraries(main hello)
target_link_libraries(target library1library2…)
add_subdirectory - 向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置
1# 添加src子目录,src中需有一个CMakeLists.txt 2add_subdirectory(src)
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
aux_source_directory - 发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构建源文件列表
1# 定义SRC变量,其值为当前目录下所有的源代码文件 2aux_source_directory(. SRC) 3# 编译SRC变量所代表的源代码文件,生成main可执行文件 4add_executable(main ${SRC})
aux_source_directory(dir VARIABLE)
CMake常用变量
CMAKE_C_FLAGS gcc编译选项 CMAKE_CXX_FLAGS g++编译选项 1# 在CMAKE_CXX_FLAGS编译选项后追加-std=c++11 2set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") CMAKE_BUILD_TYPE 编译类型(Debug, Release) 1# 设定编译类型为debug,调试时需要选择debug 2set(CMAKE_BUILD_TYPE Debug) 3# 设定编译类型为release,发布时需要选择release 4set(CMAKE_BUILD_TYPE Release) CMAKE_BINARY_DIR PROJECT_BINARY_DIR <projectname>__BINARY_DIR 这三个变量指代的内容是一致的。 如果是 in source build,指的就是工程顶层目录。 如果是 out-of-source 编译,指的是工程编译发生的目录。 PROJECT_BINARY_DIR 跟其他指令稍有区别,不过现在,你可以理解为他们是一致的。 CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR <projectname>__SOURCE_DIR 这三个变量指代的内容是一致的,不论采用何种编译方式,都是工程顶层目录。 也就是在 in source build时,他跟 CMAKE_BINARY_DIR 等变量一致。 PROJECT_SOURCE_DIR 跟其他指令稍有区别,现在,你可以理解为他们是一致的。 CMAKE_C_COMPILER:指定C编译器 CMAKE_CXX_COMPILER:指定C++编译器 EXECUTABLE_OUTPUT_PATH:可执行文件输出的存放路径 LIBRARY_OUTPUT_PATH:库文件输出的存放路径
CMake编译工程
两种方式设置编译规则
包含源文件的子文件夹包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory添加子目录即可;
包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的CMakeLists.txt中;
编译流程
手动编写 CmakeLists.txt。
执行命令
cmake PATH
生成 Makefile ( PATH 是顶层CMakeLists.txt 所在的目录 )。
make进行编译。
注意
.
表示当前目录
./
表示当前目录
..
表示上级目录
../
表示上级目录
两种构建方式
内部构建(in-source build)
不推荐使用
内部构建会在同级目录下产生一大堆中间文件,这些中间文件并不是我们最终所需要的,和工程源文件放在一起会显得杂乱无章。
外部构建(out-of-source build)
推荐使用
将编译输出文件与源文件放到不同目录中
#1.在当前目录下,创建build文件夹
mkdir build
#2.进入到build文件夹
cd build
#3.编译上级目录的cMakeLists.txt,生成Makefile和其他文件
cmake
#4.执行make命令,生成target
make