在linux中配置c++和cmake环境
Prefix: 熟悉常见Linux开发命令,并熟悉Linux中的cmake等操作。
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++的编译工作
四步:
- 预处理 pre-processing // .i 文件
- 编译 compiling // .s 文件
- 汇编 assembling // .o 文件
- 链接 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())
- 编译程序时要加上-g,之后才能进行gdb调试:
gcc -g main.c -o main
- 回车键会重复执行上一次命令
5.1 VSCode常用快捷键
转到文件 ctrl+p
打开命令面板 Ctrl + Shift + P
打开终端 ctrl + `
当前行上移/下移 alt + up/down
转到定义处 F12/ ctrl 加鼠标左击
在 Ctrl+P 窗口下还可以:
- 直接输入文件名,跳转到文件
- ? 列出当前可执行的动作
- ! 显示 Errors 或 Warnings ,也可以 Ctrl+Shift+M
- : 跳转到行数,也可以 Ctrl+G 直接进入
- @ 跳转到 symbol (搜索变量或者函数),也可以 Ctrl+Shift+O 直接进入
- @ 根据分类跳转 symbol ,查找属性或函数,也可以 Ctrl+Shift+O 后输入:进入
-
根据名字查找 symbol ,也可以 Ctrl+T
常用窗口快捷键:
- Ctrl+Shift+N 打开新窗口
- Ctrl+Shift+W 关闭窗口
- Ctrl+N 新建文件
- Ctrl+tab 文件间切换
代码编辑相关快捷键
- 代码行缩进 Ctrl+[ 、 Ctrl+] 或者 选中后shift tab, tab
- 向上向下复制一行: Shift+Alt+Up 或 Shift+Alt+Down
- 常用:在当前行下边插入一行 Ctrl+Enter
快捷键:光标相关
- 移动到行首: Home
- 移动到行尾: End
- 移动到文件结尾: Ctrl+End
- 移动到文件开头: Ctrl+Home
快捷键:查找替换
- 查找 Ctrl+F
- 查找替换 Ctrl+H
- 整个文件夹中查找 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常用变量
重要指令
- cmake_minimum_required 指定CMake最小版本要求
cmake_minimum_required(VERSION version_number[fatal error])
# CMake最小版本要求为2.8.3
cmake_minimum_required(VERSION 2.8.3)
- project 指定工程名称,并可指定工程支持的语言
project(project_name[CXX][C][Java])
# 指定工程名为HELLOWORLD
project(helloworld)
- set 显示定义的变量
set(VAR [VALUE][CACHE TYPE DOCSTRING [FORCE]])
# 定义SRC变量,其值为sayhello.cpp hello.cpp
set(SRC sayhello.cpp hello.cpp)
- include_directories - 向工程添加多个特定的头文件搜索路径
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
# 将/usr/include/myincludefolder 和 ./include 添加到头文件搜索路径
include_directories(/usr/include/myincludefolder ./include)
- link_directories - 向工程添加多个特定的库文件搜索路径
link_directories(dir1 dir2 ...)
# 将/usr/lib/mylibfolder 和 ./lib 添加到库文件搜索路径
link_directories(/usr/lib/mylibfolder ./lib)
- add_library - 生成库文件
add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
SHARED 动态库
STATIC 静态库
# 通过变量 SRC 生成 libhello.so 共享库
add_library(hello SHARED ${SRC})
- add_compile_options - 添加编译参数
# 添加编译参数 -Wall -std=c++11 -O2
add_compile_options(-Wall -std=c++11 -O2)
- 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文件
两种方式设置编译规则:
- 包含源文件的子文件夹包含CMakeLists.txt文件,主目录的CMakeLists.txt通过add_subdirectory
添加子目录即可; - 包含源文件的子文件夹未包含CMakeLists.txt文件,子目录编译规则体现在主目录的
CMakeLists.txt中;
编译流程:
- 手动编写 CMakeLists.txt
- 执行命令 cmake PATH 生成 Makefile ( PATH 是顶层CMakeLists.txt 所在的目录 )
- 执行命令 make 进行编译
tips:
. #当前目录
./ #当前目录
.. #上级目录
../ #上级目录
两种构建方式
-
内部构建
-
外部构建(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 调试项目
- 配置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
更多推荐
所有评论(0)