【B站视频教程笔记】基于VSCode和CMake实现C/C++开发 | Linux篇(gcc/g++)(安装、配置、使用详细教程)(VSCode教程)(CMake教程)(精!)
基于VSCode和CMake实现C/C++开发 | Linux篇
文章目录
- 目录结构
- 文件编辑
- vim(编辑器之神,linux里可以畅通无阻,必学,但不是现在!)
- 安装GCC和GDB
- g++编译过程
- 动手操作
- g++编译参数
- 编译带调试信息的可执行文件 -g
- 优化源代码 -O[n]
- 案例:优化等级
- -l (小写L)指定库文件和 -L 指定库文件路径
- -I (大写i)指定头文件搜索目录
- 打印警告信息 -Wall 和关闭警告信息 -w
- 设置编译标准 -std=c++xx
- 指定输出文件名 -o
- -D定义宏(选择开启宏或关闭宏)
- 使用 man gcc 或 man g++ 查看手册
- 实战:g++命令行编译
- 编译生成可执行文件
- 编译生成静态库(扩展名.a),并链接生成可执行文件
- 编译生成动态库(扩展名.so),并链接生成可执行文件
- GDB调试器(GNU Debugger)
- 【实战】命令行调试
- 相应快捷指令
- VSCode在linux16.04下的安装及使用(以及插件,比如CMake)
- 安装
- 使用,自己看视频吧
- 插件安装
- 高频使用快捷键或操作
- Cmake使用
目录结构
Bin:全称binary,含义是二进制。该目录中存储的都是一些二进制文件,文件都是可以被运行的。
Dev:该目录中主要存放的是外接设备,例如盘、其他的光盘等。在其中的外接设备是不能直接被使用的,需要挂载(类似window下的分配盘符)。
Etc:该目录主要存储一些配置文件。
Home:表示“家”,表示除了root用户以外其他用户的家目录,类似于windows下的User/用户目录。
Proc:全称process,表示进程,该目录中存储的是Linux运行时候的进程。
Root:该目录是root用户自己的家目录。
Sbin:全称super binary,该目录也是存储一些可以被执行的二进制文件,但是必须得有super权限的用户才能执行。
Tmp:表示“临时”的,当系统运行时候产生的临时文件会在这个目录存着。
Usr:存放的是用户自己安装的软件。类似于windows下的program files。(应该说错啦!!这是unix系统资源目录)
Var:存放的程序/系统的日志文件的目录。
Mnt:当外接设备需要挂载的时候,就需要挂载到mnt目录下。
树工具
sudo apt install tree文件编辑
vim(编辑器之神,linux里可以畅通无阻,必学,但不是现在!)
还介绍了gedit、nano编辑器,,鸡肋
安装GCC和GDB
每次安装新的程序之前都要运行下这个:
sudo apt-get update安装gdb
sudo apt install build-essential gdb查看版本
gcc --version g++ --version gdb --version安装CMake
– sudo apt-get update –
sudo apt-get install cmake查看cmake版本
cmake --versiong++编译过程
动手操作
安装vim
新建testcpp文件夹
新建test.cpp文件
vim里设置制表符空格为4个(默认为8个)
键入如下代码:
#include <iostream> using namespace std;int main() {cout << "This is easy!" << endl;return 0; }g++编译
g++ test.cpp -o test生成了可执行文件并运行,结果:
yg@ubuntu:~/arnold_test/testcpp$ ls test test.cpp yg@ubuntu:~/arnold_test/testcpp$ ./test This is easy! yg@ubuntu:~/arnold_test/testcpp$根据上面预处理、编译、汇编、链接那几个步骤,生成四个文件:
yg@ubuntu:~/arnold_test/testcpp$ ls test test.cpp test.i test.o test.s yg@ubuntu:~/arnold_test/testcpp$g++编译参数
编译带调试信息的可执行文件 -g
优化源代码 -O[n]
案例:优化等级
vim创建test_opt.cpp
#include <iostream> using namespace std;int main(){unsigned long int counter;unsigned long int result;unsigned long int temp;unsigned int five;int i;for (counter = 0; counter < 2009*2009*100/4 + 2010; counter +=(10 - 6)/4){temp = counter/1979;for(i = 0; i < 20; i++)//每一次for循环都会进行复杂的计算five = 200 * 200 / 8000;result = counter;}cout << "result = " << result << endl;return 0; }生成不同等级的优化代码:
g++ test_opt.cpp -o test_opt_o g++ test_opt.cpp -O2 -o test_opt_o2 g++ test_opt.cpp -O3 -o test_opt_o3…
用time命令测试生成的每个可执行文件的的运行时间
-l (小写L)指定库文件和 -L 指定库文件路径
-I (大写i)指定头文件搜索目录
打印警告信息 -Wall 和关闭警告信息 -w
设置编译标准 -std=c++xx
指定输出文件名 -o
-D定义宏(选择开启宏或关闭宏)
使用 man gcc 或 man g++ 查看手册
man gcc实战:g++命令行编译
编译生成可执行文件
建立如下目录:
yg@ubuntu:~/arnold_test/GCC_demo_swap$ tree . ├── include │ └── swap.h ├── main.cpp └── src└── swap.cpp- main.cpp
- swap.cpp(里面不用包含swap.h也行吧?作者写多了?没写多,就是要这样写,详情见我另一篇博文)
- swap.h
执行编译:(由于swap.h与main.cpp不在同一目录,要用-I参数指定其路径)
g++ main.cpp ./src/swap.cpp -Iinclude结果:
yg@ubuntu:~/arnold_test/GCC_demo_swap$ ls a.out include main.cpp src yg@ubuntu:~/arnold_test/GCC_demo_swap$ ./a.out 交换前:a = 1, b = 2 交换后:a = 2, b = 1 success! yg@ubuntu:~/arnold_test/GCC_demo_swap$当然编译也能增加其他一些需要的参数:
g++ -O2 main.cpp ./src/swap.cpp -Iinclude -Wall -o main结果:
yg@ubuntu:~/arnold_test/GCC_demo_swap$ g++ -O2 main.cpp ./src/swap.cpp -Iinclude -Wall -o main yg@ubuntu:~/arnold_test/GCC_demo_swap$ ls a.out include main main.cpp src yg@ubuntu:~/arnold_test/GCC_demo_swap$ ./main 交换前:a = 1, b = 2 交换后:a = 2, b = 1 success!编译生成静态库(扩展名.a),并链接生成可执行文件
用的还是之前的代码
yg@ubuntu:~/arnold_test/GCC_demo_swap$ tree . ├── include │?? └── swap.h ├── main.cpp └── src└── swap.cppar归档?
我没在swap.cpp加include "swap.h"这句代码,编译时也没加-I../include,也能成功生成
staticmain能直接运行
编译生成动态库(扩展名.so),并链接生成可执行文件
删除上面生成的swap.o和libswap.a
sharemain不能直接运行,要在运行时加载(调用)动态库libswap.so才行
你可以设置它运行时去找动态库的目录,
# 运行可执行文件(等号左右不能有空格!!!!) LD_LIBRARY_PATH=src ./sharemain当然你也可以直接把libswap.so拷贝到sharemain的目录下(不行哎!linux下同目录也搜索不到!)
GDB调试器(GNU Debugger)
【实战】命令行调试
调试代码:sum.cpp
#include <iostream> using namespace std;int main(int argc, char **argv) {int N = 100;int sum = 0;int i = 1; // calculate sum from 1 to 100while(i <= N){sum = sum + i;i = i + 1;}cout << "sum = " << sum << endl;cout << "The program is over." << endl;return 0; }编译生成两个文件,一个带调试功能,一个不带调试功能
g++ sum.cpp -o sum_no_gdb g++ -g sum.cpp -o sum_yes_gdb yg@ubuntu:~/arnold_test/gdb_test$ ls -lh 总用量 36K -rw-rw-r-- 1 yg yg 289 Sep 8 02:32 sum.cpp -rwxrwxr-x 1 yg yg 9.1K Sep 8 04:39 sum_no_gdb -rwxrwxr-x 1 yg yg 20K Sep 8 04:39 sum_yes_gdb yg@ubuntu:~/arnold_test/gdb_test$可以看到,sum_yes_gdb要大一些
执行:
gdb sum_yes_gdb开始调试
gdb sum_yes_gdb进入调试器:ctrl + x,a
相应快捷指令
打断点:b + 行数
查看断点信息:i
运行程序:r
下一句代码(不进入代码):n
下一句代码(进入代码):s
打印变量:p + 变量名
跳到下一个断点:c
监视变量值:display + 变量名
执行上次执行的命令:回车键(Enter)
显示断点附近代码(调试器模式时无效):list
退出调试:q
VSCode在linux16.04下的安装及使用(以及插件,比如CMake)
安装
Linux下VSCode的安装和使用(VScode C/C++配置 CMake的使用)(GCC、GDB)(各类插件 Snippets、Code Runner、Include Autocomplete)
使用,自己看视频吧
https://www.bilibili.com/video/BV1fy4y1b7TC?p=12
插件安装
C/C++插件
CMake
CMake Tools
安装(可选):C/C++ Snippets、Code Runner、Include Autocomplete
作者安装插件参考:
高频使用快捷键或操作
Cmake使用
见:Cmake教程
总结
以上是生活随笔为你收集整理的【B站视频教程笔记】基于VSCode和CMake实现C/C++开发 | Linux篇(gcc/g++)(安装、配置、使用详细教程)(VSCode教程)(CMake教程)(精!)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: VMWare ubuntu虚拟机每次开机
- 下一篇: linux ubuntu QT 下载和安