ubuntu(linux)安装vscode并配置c++编译及cmake多文件编译(代码片段)

Tengfei_Y Tengfei_Y     2023-04-11     299

关键词:

目录标题

VS code配置c++编译环境

之前在用linux系统下使用VS code编译运行c++,经常各种配置,虽然最终都能够成功跑起来,但是没有深刻理解其中的原理,出错的时候只能参考别人的建议各种尝试,对出错原因及修改办法不甚理解,基于此,本人打算从Ubuntu(linux)安装到Vscode编辑多个cpp文件开始一步一步实现,其中主要是先实现但是cpp文件的运行和调试,然后配置cmake实现多个cpp文件互联编译运行。

1. Linux系统安装

本文最终目的为在linux环境下搭建VS code/c++编译运行环境,因此选择虚拟机安装ubuntu系统,首先安装VMware虚拟机,然后下载ubuntu镜像,在虚拟机中安装unbuntu系统,操作过程参考网上教程,资源很多,此处不再详细讲解安装步骤;安装成功ubuntu后,记得更换下载源,一般选用清华源和阿里源,参看ubuntu 16.04 更换国内源

2. 在Ubuntu中安装VS code

下载安装的方式有很多种,有命令行下载安装、命令行结合可视化界面下载安装,本人使用的是后者。

2.1. 首先下载对应系统的VS code安装包

进入VScode官网下载VS code,此处有一些技巧,因为vscode在ubuntu中下载较慢,可以先在window下下载好ubuntu对应的VSCode安装包,然后通过ssh协议传输至Ubuntu,即可实现高效安装。这里展开讲一下实现细节,有助于理解gitbash与gihub及本地端口与远程端交互问题。
(1). 首先在本地window端安装gibash(或者xshell)等终端工具,或者直接使用window自带的终端工具powershell。
(2). 使用scp命令将本地端下载的安装包复制到虚拟机ubuntu中(远程端),此时要保证远程端已经安装Openssh协议,没有安装参考网上教程安装,本地windows端默认安装了ssh协议,所以两者都支持scp命令工具,与远程端建立链接需要知道远程端的ip及对应的用户名。

	ifconfig  #在虚拟机终端输入该命令就可查看对应的ip地址,为显示信息中  **i net地址: **后的信息。
	scp test.txt ytf666@19x.xxx.xx.xxx:/mnt/tengfei   #在本地window端打开gitbash,将对应的文件复制到虚拟机19x.xxx.xx.xxx中,其中ytf666为用户名

在scp的过程中可能会遇到如下问题:

这种一般是该文件夹没有开通远程权限的问题,在linux终端输入如下命令即可

	chmod -R 777 /mnt/    #即可开通mnt文件夹下的所有权限

如果使用的是xshell,且遇到如下问题

这种一般是主机端或者远程端没有安装scp导致,如果确认已经安装scp(可通过gitbash或者powershell来实验确认),则可能是安装的xshell少插件等问题。

2022/11/8添加内容如下
上面阐述了从本地服务器复制文件到远程服务器,此处介绍从远程服务器下载文件到本地服务器,无论是从远程服务器下载还是上传到远程服务器,均需要在本地服务器打开git bash(终端),且操作路径在本地服务器路径下;如果要下载文件夹或者压缩包,则使用下面的命令:

	 scp -r tengfei.yue@10.xx.xx.xx:/mnt/cfs/users/tengfei.yue/tengfei/data/changjing/json_class_image/other1000.tar /c/Users/admin/Desktop/      //分别是远程服务器的账户名和ip、所需下载的文件路径、最终的目的路径,-r表示递归的意思

注意上面的命令中如果下载的是文件夹或者压缩包,则需要 -r 进行递归下载,单个文件的话可以省略 -r ,并且冒号后面不能有空格,否则会出现如下所示错误:


2.2. 安装VS code

本人为了便于管理一般把安装包放置在下载(downloads)下,即/home/ytf666/Downloads路径下,在此处打开终端,安装VS code

	sudo dpkg -i code_1.71.1-1662667267_amd64.deb

安装后,其快捷方式会默认存放在 /usr/share/applications 目录下

将快捷方式复制到桌面

	cp code.desktop ~/Desktop/

选中桌面的vscode快捷图标,右击鼠标,允许启动。(此时齿轮icon变成正常图标,双击正常启动vscode)

3. 在ubuntu系统下的vscode中配置g++/gcc编译、运行环境

3.1. 打开VS Code,快捷键(Ctrl + Shift + X)打开扩展模块

3.2. 安装GCC/g++/gdb

VS Code只是一个文本编辑器,如果想要编译C++,需要安装g++编译器,GCC代表GNU编译器集合,GDB是GNU调试器。
快捷键Ctrl + Alt + T打开终端,输入:

	sudo apt-get update    # 过时的 Linux 发行版有时会干扰安装新软件包的尝试,因此先对软件包更新一下
	gcc -v    #检查一下是否已安装好gcc
	sudo apt install gcc #没有安装好gcc,则用该命令安装即可

gcc安装成功使用 gcc -v 检查,结果如下:

接下来使用命令安装 GNU 编译器工具和 GDB 调试器:

	gdb -v  #检查一下是否已经安装好gdb
	sudo apt-get install build-essential gdb    #安装gdb

检验是否安装成功:

	whereis g++
	whereis gdb


此时已经完成最基本的c++编译环境配置,可以编译、运行、调试单个的cpp/c文件。

3.3. 测试配置好的基础版VS code

此处测试的为单个项目,因此在单个文件的根目录下配置task和launch即可,后面介绍同时在多个项目上工作时,创建工作区的方法。

  1. 在指定目录下创建.cpp文件用来测试,本人习惯在mnt下进行测试。

    cd /mnt
    mkdir tengfeiubuntu
    touch /tengfeiubuntu/hello.cpp

  2. 将测试文件目录加入到vscode中。

  3. 在hello.cpp中测试输出hello word,并按Ctrl+s保存,此时可能提示不能对指定文件进行修改,大概率时因为没有开通操作权限,因此可以在终端对指定文件夹开通权限

     	chmod -R 777 /mnt/    #开通了mnt文件夹下所有文件的所有权限
    

此时点击运行一般会在当前文件夹(工作空间)中自动生成.vscode文件夹,且里面包含launch.json和tasks.json两个文件;
如果没有自动生成的话,在vscode界面左边点击“运行和调试”按键 ,选择“创建launch.json”,同时这些文件都可以自己手动创建,但是一般都会自动生成的。此时调试运行可能会遇到各种问题,需要搞明白launch.json和tasks.json两个文件中各参数的具体含义,并针对性的进行修改。
本人在进行vs code配置c++编译环境时,并没有在.vscode文件夹里自动生成c_cpp_properties.json,也没有手动创建,依然可以编译调试运行c++代码,无论是快捷键还是右上角按钮均可以正常操作,但是这个文件也是VSCode调试c++时常用的json文件,个人理解:扩展程序会根据当前系统环境配置基本信息,如果信息完整则只有launch.json和task.json即可实现c++程序的调试运行编译,但毕竟是扩展程序根据当前系统环境配置的基本信息,因此有可能配置不完整,这时需要通过生成c_cpp_properties.json文件来配置缺少的信息。一般linux系统下默认生成的基本配置信息就够用了,但是window系统下是需要更改的,下面代码为ubuntu平台下默认生成的c_cpp_properties.json文件,可在这个文件中添加配置。

4. VSCode调试C++时三个常用的json
VS Code是基于文件夹运行的(配置好一切环境后会在同目录下生成.vscode文件,里面是我们的配置文件,以后只把这个文件夹拷贝并改动就可以实现在不同的机器上运行VS Code来编译C/C++程序),新建好文件夹并用VS Code打开,新建.cpp文件,此时还无法编译、运行。
linux下用vscode调试c++程序时,会在工作区的.vscode文件中遇到launch.json和tasks.json,作用分别如下:
1)、lauch.json负责的是启动任务,执行文件(可执行文件)
2)、tasks.json负责的是配置相关任务。简单来说就是负责编译链接生成可执行文件,其实就是执行终端的编译指令[g++ -g main.cpp -o main.o]。所以在执行launch.json文件之前必须先执行tasks.json
3)、launch.json和tasks.json通过launch.json中的preLaunchTask关联起来。launch.json中的preLaunchTask是为了启动tasks.json的,所以preLaunchTask对应的标签应该与task.json一致。

(1) launch.json参数介绍—对应调试相关的参数
打开方式:Ctrl+Shift+p 打开命令行(或者点击菜单栏 查看>命令面板 或者按F1),键入关键字 “launch”,选择 “Debug:Open launch.json” -> "C++(GDB/LLDB)。
作用:调试程序,如设置debug,设置可执行文件的路径,预编译等。

生成launch.json文件后,其他的属性可不改,但必须将program属性的值修改为要执行的文件。然后点击Debug->Start Debugging,既可以开始调试了,点击侧边栏的Debug图标可查看BreakPoint、Call Stack等。


    "configurations": [     //配置域
        
            "name": "(gdb) 启动",       //配置文件的名字
            "type": "cppdbg",       //调试的类型,正在使用的调试器,使用Visual Studio Windows时必须为cppvsdbg,使用GDB或LLDB时必须为cppdbg.
            "request": "launch",     //配置文件的请求类型,有launch和attach两种,表示此配置是用于启动程序还是附加到已运行的实例上
            "targetArchitecture": "x64",   //硬件内核架构,为64bit
            // "program": "输入程序名称,例如 $workspaceFolder/a.out", //这个是默认生成的样式
            // "program": "$workspaceRoot/$fileBasenameNoExtension", //$workspaceRoot指的是.vscode所在的目录(绝对路径),$fileBasenameNoExtension指的是所运行文件不带扩展名的名称,即main.cpp是main
            "program": "$fileDirname/$fileBasenameNoExtension", //调试可执行文件/程序,此处为可执行文件的路径,包括文件名字,即要执行的可执行文件的完整路径,$fileDirname指的是所运行文件所在的目录(绝对路径),这里和.vscode在同一目录(绝对路径)下
            "args": [],     //主函数调用时传入的参数,一般为空
            "stopAtEntry": false,      //设为true时程序将暂停在程序入口处,一般设为false,是否在 main 函数处暂停执行
            "cwd": "$fileDirname",     //调试时的工作目录,设置调试器启动的应用程序的工作目录,不是可执行程序的路径,而是所运行程序的路径,或者.vscode所在的目录(绝对路径),且此处的cwd路径与task.json的cwd路径不一样
            // "cwd": "$workspaceFolder",  //.vscode所在的目录(绝对路径),与$fileDirname都可以,且此处的cwd路径与task.json的cwd路径不一样
            "environment": [],   
            "externalConsole": false, //控制是否显示在新的终端,即打开外部终端执行程序,而不是在 VSCode 的控制台中运行,true显示外置的控制台窗口,false显示内置终端
            // "externalConsole": true,
            "MIMode": "gdb",      //指定连接的调试器,可以省略不写
            //"miDebuggerPath": "C:\\\\MinGW\\\\bin\\\\gdb.exe",//调试器路径,在Linux环境下需要注释掉这一行
            "setupCommands": [
                
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                ,
                
                    "description": "将反汇编风格设置为 Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                
            ],
            "preLaunchTask": "g++",       //调试会话开始前执行的任务,一般为编译程序。与tasks.json的label相对应,一般为编译程序,c++为g++, c为gcc,采用cmake的多文件编译则为build
        
    ],
    "version": "2.0.0"       //配置文件的版本,以前使用是0.2.0,新版本已经弃用,改用为2.0.0

(2) task.json参数介绍—编译参数设置
打开方式:Ctrl + Shift + p进入命令行(或者点击菜单栏 查看>命令面板 或者按F1),选择 Tasks: Configure Default Build Task
作用:指定编译规则,和preLaunchTask配合使用可以实现自动编译。
生成tasks.json后,根据自己需求修改command、args或其他字段。

	
	    "tasks": [
	        
	            "type": "cppbuild",
	            // "label": "C/C++: g++ 生成活动文件",
	            "label": "g++",     // 当前编译任务的名称,与launch.json的preLaunchTask相对应
	            "command": "/usr/bin/g++",     // cpp使用g++命令,c使用gcc,指定对应的路径,编译时执行的程序,调试ros时使用catkin_make DCMAKE_BUILD_TYPE=Debug,此时对应的命令:g++ -g $file -o $fileDirname/$fileBasenameNoExtension
	            "args": [    //编译时候的参数,传递给 command 的参数,也就是编译参数
	                "-fdiagnostics-color=always",
	                "-g",   //添加gdb调试选项
	                "$file", //当前运行的文件
	                "-o",     //指定生成可执行文件的名称
	                "$fileDirname/$fileBasenameNoExtension", //生成可执行文件的路径(包括文件名字,此处没有带后缀.out)
	                // "-std=c++11",   //使用c++11
	                // "-lpthread"       //链接thread库
	            ],       
	            "options": 
	                "cwd": "$fileDirname"   //需要进入到执行tasks任务的文件夹中,即可执行文件所在的目录(绝对路径),不包括文件名
	            ,
	            //$fileDirname 当前打开的文件所在的绝对路径,不包括文件名

	            "problemMatcher": [
	                "$gcc"
	            ],
	            "group": 
	                "kind": "build",
	                "isDefault": true     //为 True 时,用户可以通过 Ctrl+Shift+B 直接运行编译任务
	            ,
	            "detail": "调试器生成的任务。"
	        
	    ],
	    "version": "2.0.0"

常用路径参数含义

	$workspaceRoot 当前打开的文件夹的绝对路径+文件夹的名字

	&workspaceFolder当前程序的路径,.vscode路径

	$file当前打开正在编辑的文件名,包括绝对路径,文件名,文件后缀名
	
	$fileBasename  当前打开的文件名+后缀名,不包括路径
	
	$fileBasenameNoExtension 当前打开的文件的文件名,不包括路径和后缀名
	
	$fileDirname 当前打开的文件所在的绝对路径,不包括文件名
	
	$fileExtname 当前打开的文件的后缀名

此时可以任意进行运行、调试、编译了,无论是用F5快捷键还是用右上角的按钮都可以成功运行了。

(3) c_cpp_properties.json—编译环境相关的设置
本人在进行vs code配置c++编译环境时,并没有在.vscode文件夹里自动生成c_cpp_properties.json,也没有手动创建,依然可以编译调试运行c++代码,无论是快捷键还是右上角按钮均可以正常操作,但是这个文件也是VSCode调试c++时常用的json文件,个人理解:扩展程序会根据当前系统环境配置基本信息,如果信息完整则只有launch.json和task.json即可实现c++程序的调试运行编译,但毕竟是扩展程序根据当前系统环境配置的基本信息,因此有可能配置不完整,这时需要通过生成c_cpp_properties.json文件来配置缺少的信息。一般linux系统下默认生成的基本配置信息就够用了,但是window系统下是需要更改的,下面代码为ubuntu平台下默认生成的c_cpp_properties.json文件,可在这个文件中添加配置。

C_Cpp_Properties.json是用于配置编译器环境的,包括启动器代号、位数(这些是自定义的)、编译选项、启动设置、编译模式等。
includePath指向C/C++标准库、用户头文件所在位置。不需要CMake也可以直接编写C/C++

打开方式:Ctrl+Shift+P进入命令行(或者点击菜单栏 查看>命令面板 或者按F1),搜索C/C++ Edit configuration
作用:指定头文件路径/编译器路径

	
	    "configurations": [
	        
	            "name": "Linux",  //环境名字
	            "includePath": [
	                "$workspaceFolder/**"      //指定头文件路径,这里$workspaceFolder指定的是.vscode所在目录,如有需要在后面添加“,”后再添加新的路径。
	            ],
	            "defines": [],
	            "compilerPath": "/usr/bin/gcc",    //编译器的路径,可根据自己的安装情况进行设置
	            "cStandard": "c11",
	            "cppStandard": "c++11",           //设置使用的 C/C++ 标准
	            "intelliSenseMode": "linux-gcc-x64"
	        
	    ],
	    "version": 4


对于Windows环境下,需要自己下载编译器安装并配置,比如下载MinGW64,然后需要配置环境变量:

	变量名:MINGW
	变量值:D:\\worksoftware\\mingw-w64\\i686-8.1.0-posix-dwarf-rt_v6-rev0\\mingw32\\bin
	引入到Path环境变量中:
	%MINGW%

然后重启VS code,并在c_cpp_properties.json文件中添加

	"compilerPath":  "D:\\\\worksoftware\\\\mingw-w64\\\\i686-8.1.0-posix-dwarf-rt_v6-rev0\\\\mingw32\\\\bin\\\\g++.exe"

配置好gcc/g++、gdb调试运行编译c++环境后,运行或者调试.cpp文件,会在VS code界面左下角显示当前使用的是launch.json中configurations里的name,我这里写的是gdb启动,且后面跟着当前文件夹(工作空间)名字,我这里是onlygcc,如下图所示

此时点击右上角的三角按钮选择运行c/c++文件或者按F5会出现如下界面,选择所设置launch.json文件的configuration中name参数对应的名字即可

此时VS code右上角三角按钮中有运行c/c++文件、调试c/c++文件以及Run code三个按钮,其中运行c/c++文件、调试c/c++文件已经链接到配置好的.vscode,执行路径是通过.vscode里的json文件实现g++编译运行和gdb调试;Run code按钮是在左侧栏扩展中安装的运行扩展程序,通过自动配置调用g++实现c/cpp文件的编译运行的,与前两者的执行路径不一样;此时F5运行快捷键是链接到.vscode里的json文件中的,如果没配置.vscode则可能链接到Run code扩展按钮;
就目前我所知道的Run code扩展貌似只能进行编译运行,不能调试,只安装Run code扩展不能实现debug调试功能,想要断点debug调试还是要配置.vscode中的launch.json文件使用gdb调试。

4. 在ubuntu系统下的vscode中配置cmake,编写的CMakeLists.txt进行多文件调试。

先决条件:确保已经安装了gcc/g++/gdb,没有安装的话看3.2部分。
安装VS code插件,搜索安装插件CMake Tools。

4.1. 安装CMake

官网下载CMake安装包,以3.22.4版本为例,下载这个包,如下图:

如果在ubuntu端下载较慢,可以在本地window端下载对应版本的cmake安装包,然后可采取2.1所阐述的手段进行下载。
安装过程:

  1. cd 到资源下载目录下,解压资源;

     tar -zxvf cmake-3.22.4.tar.gz
    
  2. cd 到解压后的cmake-3.22.4目录下,进行检查;

     ./bootstrap
    

可能会出现Could not find OpenSSL

安装openssl之后,再检查一遍;

	./bootstrap
  1. 编译构造;

     make
    
  2. 安装;

     sudo make install
    
  3. 检验安装是否成功。

     cmake --version
    

4.2. 使用CMake创建项目

为什么要使用CMake?理论上说,任意一个C++程序都可以用g++来编译。但当程序规模越来越大时,一个工程可能有许多个文件夹和源文件,这时输入的编译命令将越来越长。通常一个小型C++项目可能含有十几个类,各类间还存在着复杂的依赖关系。其中一部分要编译成可执行文件,另一部分要编译成库文件。如果仅靠g++命令,我们需要输入大量的编译指令,整个编译过程会变得异常繁琐。因此,对于C++项目,使用一些工程管理工具会更加高效。历史上工程师们曾使用makefile进行自动编译,但cmake要比它更加方便。
在一个cmake工程中,用cmake命令生成一个makefile文件,然后用make命令根据这个makefile文件的内容编译整个工程。

使用CMake创建项目有两种方法:直接手动构建CMakeList;在VS code中通过快捷键生成CMakeList,然后在此基础上修改。

4.2.1. 直接手动构建CMakeList

编写一个求两数之和的程序项目,输入两个数a、b,可得到两数求和之后的结果c=a+b。
a. 准备程序文件
(1). 打开终端,cd到自己常用放置项目的路径

	cd /mnt/tengfeiubuntu/
(2). 建立自己的项目文件夹

	mkdir stardtest
(3). 进入项目中,并用VS code打开编辑,也可以用vim,但是vim不好用,所以推荐用VS code

	cd stardtest  //进入该项目
	mkdir build  //创建build文件夹(工作空间),也可以在VS code界面创建
	mkdir include   //创建include文件夹(工作空间),也可以在VS code界面创建
	mkdir src     //创建src文件夹(工作空间),也可以在VS code界面创建
	touch CMakeLists.txt    //创建build文件夹(工作空间),也可以在VS code界面创建
	code . //用VS code打开以便于编辑

code .打开后的界面如下:

下面是比较通用的CMake目录结构,用include文件夹管理.h头文件,用.src文件夹管理.cpp源文件,在.build文件夹内完成一系列的编译工作,这样cmake生成的中间文件都在build目录,不会“污染”开发目录(将build目录加入.gitignorej即可忽略CMake所产生的所有中间文件),在编译出问题的时候也可以直接删除buidl目录重新编译。
.
├── build
├── CMakeLists.txt
├── include
│ └── Sum.h
└── src
├── Sum.cpp
└── main.cpp

头文件Sum.h/Sum.hpp,如下所示:

	#ifndef __HELLO_H
	#define __HELLO_H
	int Calculate_sum_Of_Two_Number(int x, int y);
	#endif

头文件Sum.cpp,如下所示:

	int Calculate_sum_Of_Two_Number(int x,int y)
	
	    int z=0;
	    z=x+y;
	    return (z);
	

主函数main.cpp,如下所示:

	#include "hello.h"
	#include <stdio.h>
	#include <iostream>
	using namespace std;
	int main()
	
	    int a=0, b=0, c=0;
	
	    //------c语言模式,不需要使用库iostream-------
	    //printf("please input two paramerer: ")
	    //scanf("%d", &a)
	    //scanf("%d", &b)
	    //c = Calculate_sum_Of_Two_Number(a,b);
	    //printf("the sum is: %d", c)
	
	    //------ c++模式,需要使用库iostream----------
	    cout<<"please input two paramerer: "<<endl;
	    cin>> a >> b;
	    c = Calculate_sum_Of_Two_Number(a,b);
	    cout<<"the sum is: "<< c <<endl;
	
	    return 0;
	

b. 编写CMakeList.txt文件
现在编写CMakeLists.txt文件,该文件放在和src,include的同级目录,实际放在哪里都可以,只要里面编写的路径能够正确指向就好了,一般范式是放在和src,include的同级目录。CMakeLists.txt文件,如下所示:

	#1.cmake verson,指定cmake版本
	cmake_minimum_required(VERSION 3.2)
	
	#2.project name,指定项目的名称,一般和项目的文件夹名称对应,声明一个cmake工程,工程名为stardtest
	PROJECT(stardtest)
	# #也可以写上项目的版本号,如下所示
	# project(stardtest VERSION 0.1.0)
	
	#3.添加c++ 11标准支持,如果程序中使用了C++11标准,则需要设置告诉编译器,没有可以不用写。
	set( CMAKE_CXX_FLAGS "-std=c++11")
	
	#4.设置编译器编译模式,对于编译用的Debug模式和调试用的Release模式,在Debug模式中,程序运行较慢,当可以在IDE中进行断点调试,而Release模式则速度较快,但没有调试信息。不设置默认是Debug模式。
	set( CMAKE_BUILD_TYPE "Debug")
	
	#5.添加引用的第三方头文件,此项目main.cpp引用的头文件有Sum.h,因此需要添加头文件目录,因为和CMakeList.txt同级,所以此处目录只写include即可,应写对头文件所在的目录,以防找不到相应的头文件而报错,如果难以确定就直接写上绝对路径即可
	include_directories(include)    #其实头文件也可以放在源文件所在的文件夹中,这样就不用添加此命令,但是为了整个工程的简洁干净便于管理,所以建议放到include文件夹中。
	# #也可以将include_directories全部大写,如下所示,是一样的表达,其他的类似,也是可以全部大写表示的,例如add_executable写成ADD_EXECUTABLE
	# INCLUDE_DIRECTORIES(include)
	
	
	# #------------------------src下面有多个.cpp需要编译,相应的库函数也都有,这个时候可以执行下面的步骤------------------------------------
	# #6.source directory,源文件目录,j将源文件目录/路径 src赋值给DIR_SRCS
	# AUX_SOURCE_DIRECTORY(src DIR_SRCS)
	# #7.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
	# SET(TEST_MATH $DIR_SRCS) #将编译用的源文件所在路径DIR_SRCS赋值给TEST_MATH
	# # #8.编译生成库文件,将Sum.cpp生成共享库文件libSum.so,这条命令告诉cmake,把这些源文件编译成一个叫作“Sum”的共享库,其实有了6和7没有必要再执行这一步
	# # add_library(Sum SHARED src/xxx1.cpp src/xxx2.cpp ...)
	# #9.add executable file,添加要编译的可执行文件
	# ADD_EXECUTABLE($PROJECT_NAME $TEST_MATH) #这里生成的可执行文件的名字为项目名字,$PROJECT_NAME就是#2中PROJECT(stardtest)的项目名字stardtest
	# #10.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),以及生成的libxxx.so,就添加这些库的名称
	# TARGET_LINK_LIBRARIES($PROJECT_NAME m)
	
	
	#6.编译生成库文件,将Sum.cpp生成共享库文件libSum.so,这条命令告诉cmake,把这些源文件编译成一个叫作“Sum”的共享库
	add_library(Sum SHARED src/Sum.cpp)
	
	#使用add_library(Sum Sum.cpp)能同时生成静态库文件libSum.a和动态库文件libSum.so
	#使用add_library(Sum STATIC Sum.cpp)能生成静态库文件libSum.a
	#在linux中,库文件分为静态库和动态库两种,静态库以.a作为后缀名,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间。
	#同时add_library(Sum SHARED Sum.cpp)后面的源文件可以接任意多个,同时生成一个库文件,例如add_library(Sum SHARED Sum.cpp b.cpp d.cpp hello.a ...)
	# #对于已经有的外部依赖库的添加实例如下:
	# # 寻找OpenCV库,感觉下面两步没啥作用
	# set(OpenCV_DIR /home/chaofan/opt/opencv-3.4.4/release) #相当于将后面参数赋给前面的参数,类似于给路径起了个别名
	# find_package( OpenCV 3 REQUIRED )
	# # 指定库文件路径,全局请求所有库文件,并赋值给Opencv3.0_LIB
	# file(GLOB_RECURSE Opencv3.0_LIB "/home/LiuMC/software/third_lib/opencv3.0-install/lib/*.so")
	# # 指定头文件路径
	# set(Opencv3_INLCUDE_DIRS "/home/LiuMC/software/third_lib/opencv3.0-install/include")
	# # 添加头文件到工程中
	# include_directories(include $OpenCV_INCLUDE_DIRS)
	# # 执行主文件imageBasics.cpp,生成可执行文件imageBasics
	# add_executable( imageBasics imageBasics.cpp )
	# # 链接OpenCV库文件到工程中
	# target_link_libraries( imageBasics $OpenCV3.0_LIB )
	
	#7.add executable file,添加要编译的可执行文件,编译main.cpp,生成可执行文件main,也可以将main写成$PROJECT_NAME,即为当前项目名称,就是#2中PROJECT(stardtest)的项目名字stardtest
	add_executable(main src/main.cpp)   
	
	#8.add link library,添加可执行文件所需要的库,比如我们用到了libSum.so(命名规则:lib+name+.so),就添加该库的名称
	target_link_libraries(main Sum)  #生成的主文件可执行文件main链接到共享库文件库libSum.so,可执行程序即可调用库文件中的函数

编写完成CMakeList.txt后按ctrl+s保存后,进入到build文件夹进行编译

	cd build
	cmake .. #要想该命令有效,在创建好cmakelist后,不要ctrl+s保存,否则cmake..不能生成对应的makefile,ctrl+s后会自动对应cmake tools工具中的编译和运行,cmake tools与命令有一定的区分性,因此通过json执行命令进行编译运行调试,与cmake tools还不太一样,如果json想通过cmaketools来编译运行调试cpp源文件则需要将cmaketools对应的环境和生成文件路径写到json中,但是这其实增加了执行过程,不建议这样,因为仅使用cmaketools就可以了,没必要增加复杂过程,仅使用cmaketools与通过json执行命令进行编译运行调试效果是一样的。
	make

操作后,在build下生成的目录结构如下:
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.2.2
│ │ │ ├── CMakeCCompiler.cmake
│ │ │ ├── CMakeCXXCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ ├── CompilerIdC
│ │ │ │ ├── a.out
│ │ │ │ └── CMakeCCompilerId.c
│ │ │ └── CompilerIdCXX
│ │ │ ├── a.out
│ │ │ └── CMakeCXXCompilerId.cpp
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeOutput.log
│ │ ├── CMakeTmp
│ │ ├── feature_tests.bin
│ │ ├── feature_tests.c
│ │ ├── feature_tests.cxx
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── progress.marks
│ │ ├── TargetDirectories.txt
│ │ └── test_sqrt.dir
│ │ ├── build.make
│ │ ├── C.includecache
│ │ ├── cmake_clean.cmake
│ │ ├── DependInfo.cmake
│ │ ├── depend.internal
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── link.txt
│ │ ├── progress.make
│ │ └── src
│ │ ├── b.c.o
│ │ └── main.c.o
│ ├── cmake_install.cmake
│ ├── Makefile
│ └── test_sqrt
├── CMakeLists.txt
├── include
│ └── b.h
└── src
├── b.c
└── main.c
注意在build的目录下生成了一个可执行的文件main,运行获取结果如下:

	命令:
	./main
	结果:
	input a:49.000000
	sqrt result:7.000000

此时VS code界面左下角显示如下:

其中No Kit Selected这个不影响运行,因为没有选择过编译器,所以显示No Kit Selected,运行过程中会选择默认编译器,想要选一下的话,点击该位置,在最上面命令窗口会跳出可选择的词条,选在GCC…即可,如下图;

以上过程是不使用vscode,单纯使用cmake进行编译,同时也表明vscode只是一个编辑和调用工具。
下面使用VSCode进行代码的调试和运行,本质上,vscode就是调用cmake进行项目的构建,所以,令人头疼的launch.json与tasks.json其实也就只是调用cmake进行项目的编译,然后调用gdb进行代码的调试而已,而c_cpp_properties.json一般用于编译环境相关的设置,没有太大作用,甚至可以没有该文件,使用默认即可。

创建.vscode文件夹
launch.json

	
	    "configurations": [
		        
		            "name": "g++ -生成和调试活动文件",
		            "type": "cppdbg",
		            "request": "launch",
		            "program": "$workspaceFolder/build/$fileBasenameNoExtension", //运行可执行文件,此处为可执行文件的路径,包括文件名字,$fileBasenameNoExtension即为所生成可执行文件的名字,&workspaceFolder为.vscode路径;
		             //"program": "$command:cmake.launchTargetPath", //通过cmake tools解析得到要运行可执行程序的绝对路径包括文件名字,该类型的路径设置适用于cmake tool生成可执行程序,(camketool是vscode扩展库中的插件,它的执行和json文件执行是不同的),目前用不上
		            "args": [],
		            "stopAtEntry": false,
		            "cwd": "$fileDirname", //调试时的工作目录,设置调试器启动的应用程序的工作目录,这里的路径不是要调试的可执行文件的绝对路径,与task.json的cwd路径不一样,这里可以为所运行的程序main.cpp的绝对路径或者.vscode所在的目录(绝对路径),不包括文件名字,一般用所运行程序的绝对路径即可,即$fileDirname,
		            // "cwd": "$workspaceFolder",   
		            "environment": [], //目前测试不改变环境,也可以进行编译运行和调试,此处有待深究
		            "externalConsole": false, //控制是否显示在新的终端
		            // "externalConsole": true,
		            "MIMode": "gdb",
		            "setupCommands": [
		                
		                    "description": "为 gdb 启用整齐打印",
		                    "text": "-enable-pretty-printing",
		                    "ignoreFailures": true
		                ,
		                
		                    "description": "将反汇编风格设置为 Intel",
		                    "text": "-gdb-set disassembly-flavor intel",
		                    "ignoreFailures": true
		                
		            ],
		            "preLaunchTask": "build",
		        
		    ],
		    "version": "2.0.0"

task.json

	
	    "options": 
	        // "cwd": "$fileDirname"
	        "cwd": "$workspaceFolder/build"    //需要进入到我们执行tasks任务的文件夹中,要调试的可执行程序的工作路径(绝对路径),不包括文件名
	    ,
	    "tasks": [
	        
	            "type": "shell", //可有可无
	            "label": "cmake",
	            "command": "cmake",
	            "args": [
	                "..",
	            ],
	        ,
	        
	            "label": "make",
	            "group":       //可有可无
	                "kind": "build",
	                "isDefault": true
	            ,
	            "command": "make",
	            "args": [
	
	            ]
	        ,
	        
	            "label": "build",
	            "dependsOrder": "sequence", //按照列出的顺序执行任务依赖项
	            "dependsOn":[
	                "cmake",
	                "make"
	            ]
	        
	    ],
	    "version": "2.0.0"

c_cpp_properties.json
其实c_cpp_properties.json文件基本用不上,有没有该文件都可以的,当添加该文件时,可能会报错,把"compileCommands"注释掉即可。

	
	    "configurations": [
	        
	            "name": "Linux",
	            "includePath": [
	                "$workspaceFolder/**"
	            ],
	            "defines": [],
	            "compilerPath": "/usr/bin/gcc",
	            "cStandard": "c11",
	            "cppStandard": "c++11",
	            "intelliSenseMode": "linux-gcc-x64"
	            // // "compileCommands": "$workspaceFolder/build/compile_commands.json" //这一句命令一般用不上,因为有browse
	            // "browse":  //一般别用该参数,不需要,且易出错
	            //     "path": ["$workspaceFolder"],
	            //     "limitSymbolsToIncludedHeaders": true, //一般设置为true,如果有些代码没法智能提示可以将该字段设置为false试试
	            //     "databaseFilename": "" //用不上
	            // 
	        
	    ],
	    "version": 4

以上过程即可完成整个cmake实现多文件编译运行,但调试还是通过gdb实现的。

此时点击VS code右上角三角按钮中的运行c/c++文件、按快捷键F5、VS code界面最下面蓝色条框中的buid+小三角按钮都可以使用cmake编译运行(使用cmake tools进行调试时:快速调试可以使用命令面板中的CMake: Debug目标命令,或者通过按相关的热键来启动(默认是ctrl+F5);使用vscode的launch.jsonh和task.json调试时:按快捷键F5,或者右上角的调试按钮),其中运行c/c++文件、按快捷键F5都是通过.vscode里的json文件实现cmake编译运行的,而VS code界面最下面蓝色条框中的buid+小三角按钮没有通过.vscode里的json文件实现(但不影响所有文件的执行路径和生成路径);
一般在CMakeList、.vscode的配置都没问题的时候,点击VS code右上角三角按钮中的运行c/c++文件或者按快捷键F5运行.cpp文件可能会提示执行路径有问题,但是执行路径确实没问题,此问题的原因可能是由于build中已经存在内容,而影响下一个.cpp文件的编译运行,因此可以将build及里面的内容都删除掉,重新新建一个。
VS code右上角三角按钮中有运行c/c++文件、调试c/c++文件以及Run code三个按钮,其中运行c/c++文件、调试c/c++文件执行路径是通过.vscode里的json文件实现cmake的编译运行的;Run code按钮是在左侧栏扩展中安装的运行扩展程序,通过自动配置调用g++实现c/cpp文件的编译运行的,与前两者的执行路径不一样。
VS code右上角三角按钮中点击运行c/c++文件、调试c/c++文件,选择所设置launch.json文件的configuration中name参数对应的名字即可,如下图所示:

使用cmake时 什么时候删掉整个build,什么时候只需要make clean

  1. 需要删掉整个build的情况
    (1) 首先,cmake…的作用是帮助我们生成makefile文件。学过makefile编写的应该知道,里面就是我们在命令行中编译的一行行命令。所以只要这些命令(makefile的内容)不用修改的话,我们就不需要删掉整个build文件,然后重新使用cmake…命令。
    (2) 那什么时候makefile的内容会被修改呢?比如生成的可执行文件名称我们想换一个,或者源码中引入了新的第三方库。这些变化都要在gcc命令中添加或者改动,就需要生成新的makefile了。当使用cmake时,以上类似于“生成的可执行文件名称我们想换一个”这种变化就发生在CMakeList.txt里。
    (3) 所以结论就是,当我们更改了CMakeList.txt后再编译,就需要删掉整个build文件夹,然后重新编译。走下面的流程

     rm -rf build
     mkdir build
     cd build
     cmake ..
     make
    
  2. 只需要make clean 的情况
    (1) 当源文件发生改变时,只需要make clean重新编译就行了。比如在源文件中,添加了一行

     cout<<"hi!"<<endl;
    

(2) 然后再去编译的时候只需要在build目录下,输入

	make clean

(3) 因为,如果makefile的内容不会改变时,就不需要经过cmake…这一步重新生成makefile文件了。显然加入一行输出语句对于makefile的内容不会有任何影响。
3. make clean的功能
(1) make命令可以让新生成的去覆盖旧的,但是有一些上次生成了这次不需要生成他的文件,就没法删除了。
(2)(比如上次使用make生成了文件a,文件b,文件c,这次使用make命令只需要生成文件a和文件b,并且文件a有所变化。那么这次生成的文件a会覆盖上次的文件a;上次生成的文件b保持不动,这次不需要再费劲生成一遍了;而上次生成的文件c也保持不动,尽管这次不需要文件c)
(3) 所以才需要make clean一下,删除所有被make创建的文件。
4. 什么是build
(1) Build可以认为是软件开发中不同时期编译出来的版本,其实就是开发人员把源程序打包出来的一个安装文件,很可能每天都有新的版本出现。
(2) 生成build就是指将源代码进行打包,做成一个安装文件的形式。
(3) 测试build的bug就是指在特定的版本下测试软件的bug。有可能在之前的build出现了问题,程序员改了下代码,让测试人员看看有没有把bug修复;或者程序员增加了一个新功能,让测试人员看看这个build有没有bug。

4.2.2. 在VS code中通过快捷键生成CMakeList,然后在此基础上修改

通过快捷键创建生成CMakeList,参考文档或者博客
生成相应的工作文件和CMakeList后,基于需求在此基础上修改,修改手段参考4.2.1。其实4.2.1讲的已经很全面基础了,掌握4.2.1就完全可以掌握4.2.2。

5. 通过本地windows安装VS code远程配置ubuntu中的c++编译环境

  1. 首先本地端安装VS Code

  2. 在VS code中安装Remote-SSH,安装Remote-SSH后,这里就可以把VS code看作是一种终端,只不过VS code的编辑功能相较于其他终端要好,且可以可视化显示远程端内容(这一点类似于xftp/WinSCP),这个时候将VS code与远程虚拟机ubuntu建立联系,安装Remote-SSH后,在VS code编辑器左侧栏会出现一个终端图标,如下图

  3. 点击该图标,在上方会出现齿轮样式的设置按钮,点击进去配置界面,将远程端的IP和用户名写在配置文件中,其中Host任意起名即可,HostName为远程端服务器(虚拟机ubuntu)的IP地址,在远程端服务器终端输入 ifconfig 就可查看对应的ip地址,为显示信息中 **i net地址: **后的信息,User为你所设置的用户名,如果是公司给你分配的工作空间,那么用户名就是公司给你分配的用户名,如下图:

  4. 完成与远程端的SSH通信配置后,分别在本地端和远程端安装对应的扩展,此处,可能在远程端显示不了一些扩展,因此安装不了(由此在.json和.cpp文件可能会出现代码格式问题,例如黄色波浪线、红色波浪线等,这些不用管),可能原因是网络卡顿,与远程交互存在延迟等,此时要么等一等,关掉VS code试一试,要么进入.cpp文件处,点击左侧的运行和调试按钮会提示你安装对应的扩展程序,按照提示点击安装即可。

  5. 所有以上步骤的前提是保证远程端服务器已经安装了gcc、g++、gdp、cmake,查看办法如下:

     gcc -v
     g++ -v
     gdp -v
     cmake --version
    
  6. 将第4.2.2部分的整个项目拷贝到本地端VS code在远程服务器中新建的空项目文件夹中进行测试(这也正是cmkae、.vscode的优势所在,可以跨平台直接编译运行)。

  7. 整个过程中如果遇到任何问题可参看第4部分解决。

开发环境ubuntu中使用vscode开发c/c++①(安装中文扩展|安装c/c++扩展)

...扩展二、安装C/C++扩展在之前的博客【开发环境】Ubuntu安装VisualStudioCode开发环境(下载VisualStudioCode安装器|Ubuntu安装deb包)中,在UbuntuLinux系统中安装了VisualStudioCode开发环境,下面开始介绍如何在Linux中使用VSCode开发C/C++程... 查看详情

wsl2_07vscode配置并编写python程序(代码片段)

...件首先安装WSL安装WSL之后,重新打开VSCode会提示在WSL:Ubuntu中安装相关的插件,此时我们在WSL2:Ubuntu中安装相关的插件2测试-调试Python代码编写m 查看详情

在linux上安装vscode

参考技术A1,2是指Ubuntu上的VSCode的安装,RHEL,FedoraandCentOS可以通过安装方式三来安装。通过增加Ubuntu的源来安装VSCode。或者:https://code.visualstudio.com/docs/setup/linux。 查看详情

vscode的安装和使用(代码片段)

...ttps://blog.csdn.net/x15011238662/article/details/850940063.如何在Linux/Ubuntu下安装vscode并使用步骤1:下载tar.gz的包,放到想要安装的目录下建议将安装包放在/opt目录下对压缩包进行解压:tar-zxvf 压缩包名tar-zxvfgo1.13.5.linux-amd64.tar.gz 步... 查看详情

windows环境下配置vscode+minggw学习1(代码片段)

windows环境下配置Vscode+MingGW学习1一、准备环境二、安装MingGW1.下载地址2.下载mingw-get-setup3.选择包并点击菜单Installation-applychanges。三、Vscode配置1.搜索安装C/C++插件2.搜索安装coderunner插件3.把安装后的bin目录添加到系统变... 查看详情

linux下vscode的安装和使用(vscodec/c++配置cmake的使用)(gccgdb)(各类插件snippetscoderunnerincludeautocomplete)(代码(代码片段

文章目录Linux下安装vscodeVScode安装插件编码与调试配置(转到bilibili教程-共24课)Linux下安装vscodevscode貌似也能通过apt-get方法安装,但我不确定这种方法可行性,还是用常规的方法安装吧首先先去下vscode的安装包htt... 查看详情

windows10从零安装vscode并配置c开发环境(代码片段)

工欲善其事,必先利其器有个好的编程IDE工具很重要,效率高,debug方便早就有所了解VSCode搞一哈文章目录第1步、下载第2步、解压第3步,发送桌面快捷方式第4步,双击VSCode快捷方式打开它第5步,helloworld... 查看详情

b站视频教程笔记基于vscode和cmake实现c/c++开发|linux篇(gcc/g++)(安装配置使用详细教程)(vscode教程)(cmake教程)(精!)(代码片段)

...x里可以畅通无阻,必学,但不是现在!)安装GCC和GDBg++编译过程动手操作g++编译参数编译带调试信息的可执行文件-g优化源代码-O[n]案例ÿ 查看详情

windows下安装vscode,并使用,以及中文配置

Windows下安装VScode,并使用,以及中文配置 查看详情

vscode配置c/c++环境(代码片段)

VSCode配置C/C++环境介绍下载MinGW编译器安装配置VSCode配置c/c++下载c/c++插件配置编写C/C++程序并运行后续介绍工欲善其事,必先利其器。想要优雅且高效的编写代码,必须熟练使用一些开发工具。但... 查看详情

ubuntu下安装vscode以及c/c++插件(代码片段)

摘自:VisualStudioCodeUbuntu下安装以及C/C++插件大全作者:一只青木呀发布时间:2020-08-0511:55:53网址:https://blog.csdn.net/weixin_45309916/article/details/107811506目录为何选择安装VSCodeVisualStudioCo 查看详情

mac系统vscode配置c/c++环境(代码片段)

mac系统vscode配置c/c++环境本文介绍mac系统下vscode的安装以及c环境的配置;本文特点:1. 可以在vscode自带的终端里显示c程序运行结果。2. 调试c程序时,程序中需要输入参数,可以直接在vscode自带的终端里输... 查看详情

ubuntu安装c++环境(vscode编译器)

安装编译环境(1)Ubuntu快速搭建C++开发环境(VSCode编辑器)解决VsCode代码报红问题(2)vscode写C++代码禁用编辑错误提示(红色波浪线) 查看详情

windows下,配置vscode的java开发环境

...辑器。如果之前你配置过VSCode并且失败了,那么建议重新安装,并彻底删除C:UsersAdministrator.vscode和C:UsersAdministratorAppDataRoamingCode内的所有文件。一键配置和安装VSC 查看详情

在vscode里编译c++java程序,并设置环境

...va、PHP、C#、Python等语言的编写、编译和调试,只需要安装对应的编译插件即可。这里介绍VSCode里C++、Java这2种语言的编译、环境配置,详细如下。1、公共插件1.1代码运行插件:CodeRunner图(1)安装代码运行插件 查看详情

配置vscode编译c/c++程序(代码片段)

...位置,然后把下面的/bin文件夹加入环境变量Path中 2.安装必要的插件,打开vscode,点击左面竖排第五个按钮,搜索并安装上如下三个插件 查看详情

ubuntu18.04+vscode+python+anaconda+caffe(cpu)配置(代码片段)

1.安装Anaconda官方:https://www.anaconda.com/products/individual#Downloads清华镜像:https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/2.安装VScodehttps://code.visualstudio.com/docs/?dv=linux64_ 查看详情

ubuntu系统中使用vscode(visualstudiocode)

...文件:https://code.visualstudio.com/docs?dv=linux64也可以用ubuntu自带的软件商店下载,本帖就采用这种方法。案例采用ubuntu16.04,操作如下图:首先单击APP商店图标,弹出窗口第二步输入vscode搜索应用程序,第三... 查看详情