基于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目录下。

d表示文件夹,- 表示文件

树工具

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 --version

g++编译过程

动手操作

安装vim
新建testcpp文件夹
新建test.cpp文件
vim里设置制表符空格为4个(默认为8个)

:set ts=4

键入如下代码:

#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命令测试生成的每个可执行文件的的运行时间

yg@ubuntu:~/arnold_test/test_g++_optimize$ time ./test_opt_o
result = 100904034real 0m1.390s
user    0m1.384s
sys 0m0.000s
yg@ubuntu:~/arnold_test/test_g++_optimize$ time ./test_opt_o2
result = 100904034real 0m0.001s
user    0m0.000s
sys 0m0.000s
yg@ubuntu:~/arnold_test/test_g++_optimize$ time ./test_opt_o3
result = 100904034real 0m0.001s
user    0m0.000s
sys 0m0.000s

-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
#include <iostream>
#include "swap.h"using namespace std;int main()
{int a = 1;int b = 2;cout << "交换前:a = " << a << ", " << "b = " << b << endl;swap(a, b);cout << "交换后:a = " << a << ", " << "b = " << b << endl;cout << "success!" << endl;return 0;
}
  • swap.cpp(里面不用包含swap.h也行吧?作者写多了?没写多,就是要这样写,详情见我另一篇博文)
#include "swap.h"void swap(int &a, int &b)
{int temp;temp = a;a = b;b =temp;
}
  • swap.h
#pragma once
extern void swap(int &a, int &b);

执行编译:(由于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.cpp

ar归档?

我没在swap.cpp加include "swap.h"这句代码,编译时也没加-I../include,也能成功生成

yg@ubuntu:~/arnold_test/GCC_demo_swap$ tree
.
├── include
│?? └── swap.h
├── main.cpp
├── src
│?? ├── libswap.a
│?? ├── swap.cpp
│?? └── swap.o
└── staticmain

staticmain能直接运行

编译生成动态库(扩展名.so),并链接生成可执行文件

删除上面生成的swap.olibswap.a

yg@ubuntu:~/arnold_test/GCC_demo_swap$ tree
.
├── include
│   └── swap.h
├── main.cpp
├── sharemain
├── src
│   ├── libswap.so
│   ├── swap.cpp
│   └── swap.o
└── staticmain

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++ SnippetsCode RunnerInclude Autocomplete

作者安装插件参考:

高频使用快捷键或操作



Cmake使用

见:Cmake教程

【B站视频教程笔记】基于VSCode和CMake实现C/C++开发 | Linux篇(gcc/g++)(安装、配置、使用详细教程)(VSCode教程)(CMake教程)(精!)相关推荐

  1. 基于Java的Android区块链钱包开发(ETH篇)

    基于Java的Android区块链钱包开发-ETH篇 引言 使用的库 具体代码如下 生成公私钥.地址 查余额.签名转账 引言 首先要生成12个助记词,区块链开发之生成12个助记词 使用的库 imple ...

  2. 把cpp编译为so_基于VSCode和CMake进行C/C++开发第三讲GCC编译器

    3.0 本讲目录 本系列视频,B站首发,up主: xiaobing1016 前言: GCC 编译器支持编译 Go.Objective-C,Objective-C ++,Fortran,Ada,D 和 ...

  3. Linux下gcc/g++、make和cmake的区别

    文本程序到可执行文件生成无论在什么平台大致分为以下几个部分:  1.用编辑器编写源代码,如.c文件.  2.用编译器编译代码生成目标文件,如.o.  3.用链接器连接目标代码生成可执行文件,如.exe ...

  4. Linux下 gcc/g++ 版本切换与CMake各版本安装

    一. gcc/g++ 版本切换 首先下载需要的版本(以gcc8为例) sudo apt-get install gcc-8 删除原有的gcc链接, 改为新链接 cd /usr/bin sudo rm ...

  5. openni linux arm,Ubuntu下安装配置OpenNI实战笔记

    1. 库OpenNI SensorKinect NITE的安装 (1)OpenNI step1 :下载 OpenNI库文件 选择"OpenNI Binaries"->&quo ...

  6. OpenCV中的图像基本操作--B站视频教程笔记(四)

    在学习B站教学视频的时候记录的笔记 OpenCV+TensorFlow]迪哥带你做项目!深度学习+计算机视觉实战 纯实战教学 技能点加满 3.1 形态学 首先创建一张带毛边的图片如图: 读取图片代码如 ...

  7. coderwhy老师vue.js b站视频教程笔记——第一部分

    原创不易,转载请注明出处,谢谢! 第一部分:Vue基础语法--组件化开发--模块化开发--webpack Day 01 01.(了解)vue.js课程介绍 Vue.js课程学习路线 Vue基础语法-- ...

  8. 【PyTorch深度学习实践 | 刘二大人】B站视频教程笔记

    资料 [参考:<PyTorch深度学习实践>完结合集_哔哩哔哩_bilibili] [参考 分类专栏:PyTorch 深度学习实践_错错莫的博客-CSDN博客] 全[参考 分类专栏:PyT ...

  9. coderwhy老师vue.js b站视频教程笔记——第四部分

    从项目开始 07.(掌握)项目开发-项目创建和github托管 1.项目目录列表有config文件夹是脚手架2,没有的话是脚手架3 2.使用github 2.1 通过拷贝的方式提交代码到github- ...

最新文章

  1. 用模板实现单例模式(线程安全)、模板方式实现动态创建对象
  2. 《手把手教你学C语言》学习笔记(1)---C语言的特点
  3. Linux疑难杂症解决方案100篇(十三)-TCP中的拥塞控制
  4. (单源最短路径)一文搞懂dijkstra算法
  5. 吴恩达 coursera ML 第十二课总结+作业答案
  6. cookie 百科_cookie是什么
  7. 主板没有rgb接口怎么接灯_纯白信仰打造RGB主机,四件套提升100%性能-Thermaltake...
  8. win7系统登录其他服务器端口,win7系统添加打印服务器端口的操作方法
  9. 查询某个条件在一个区间内的数据
  10. JavaScript 基础一
  11. OpenProcess()函数
  12. android pad刷机,安卓平板刷机,谨防平板变砖头!
  13. 2016.2注册破解方法
  14. 阿里云邮件推送使用方法
  15. Unity 3D 接入 移动MM (3.1.3)计费SDK
  16. 新一轮生态化创新之风,将由低代码刮起!
  17. 微信小程序:页面传递中文出现乱码
  18. 深度神经网络的训练过程,深度神经网络训练方法
  19. Python E化-英文资料自动翻译
  20. 通达OA开行业体验模式之先河

热门文章

  1. java环境用openoffice转pdf
  2. 【一周入门MySQL—5】
  3. 【MM模块】Taxes / Terms of Payment 税额和付款条件简介
  4. Smartform 动态打印选择屏幕上传的图片
  5. ABAP开发中常用的两个F4搜索帮助函数的区别
  6. 5分钟,带你领略项目经理十年的功力
  7. G_PERIOD_GET
  8. 什么是SAP重复性生产
  9. ABAP中将字符格式的金额转换为数值的函数
  10. SAP中的Currency Converting Factor