【ubuntu(Linux)安装Vs code并配置c++编译及cmake多文件编译】

2023-05-16

目录标题

  • VS code配置c++编译环境
    • 1. Linux系统安装
    • 2. 在Ubuntu中安装VS code
      • 2.1. 首先下载对应系统的VS code安装包
      • 2.2. 安装VS code
    • 3. 在ubuntu系统下的vscode中配置g++/gcc编译、运行环境
      • 3.1. 打开VS Code,快捷键(Ctrl + Shift + X)打开扩展模块
      • 3.2. 安装GCC/g++/gdb
      • 3.3. 测试配置好的基础版VS code
    • 4. 在ubuntu系统下的vscode中配置cmake,编写的CMakeLists.txt进行多文件调试。
      • 4.1. 安装CMake
      • 4.2. 使用CMake创建项目
        • 4.2.1. 直接手动构建CMakeList
        • 4.2.2. 在VS code中通过快捷键生成CMakeList,然后在此基础上修改
    • 5. 通过本地windows安装VS code远程配置ubuntu中的c++编译环境

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部分解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【ubuntu(Linux)安装Vs code并配置c++编译及cmake多文件编译】 的相关文章

  • qemu 虚拟机和宿主机之间传输文件

    实现简单的虚拟机和宿主机之间的文件传输 使用dd创建一个文件 xff0c 作为虚拟机和宿主机之间传输桥梁 dd if 61 dev zero of 61 opt share img bs 61 1M count 61 200格式化share
  • apt update和apt upgrade命令 - 有什么区别?

    在之前的文章中 xff0c 我们查看了APT 命令以及您可以使用包管理器来管理包的各种方法 这是一个总体概述 xff0c 但在本指南中 xff0c 我们暂停并重点关注 2 个命令用法 这些是apt update和apt upgrade命令
  • 48 个 Linux 面试问题和答案

    你在准备 Linux 面试吗 xff1f 我们准备了一些常见的 Linux 面试问题及其答案 如果您是初学者 xff08 具有一定的 Linux 知识或获得认证 xff09 或具有专业的 Linux 管理经验 xff0c 那么下面的问答有助
  • linux服务篇-Xinetd服务

    Xinetd 61 eXtended InterNET services daemon 扩展互联网服务守护进程 61 超级互联网守护进程 61 超级服务 xff0c xinetd是新一代的网络守护进程服务程序 xff0c 又叫超级Inter
  • 内参、外参、畸变参数三种参数与相机的标定方法与相机坐标系的理解

    https blog csdn net yangdashi888 article details 51356385 1 相机参数是三种不同的参数 相机的内参数是六个分别为 xff1a 1 dx 1 dy r u0 v0 f u0 v0为图像
  • C语言中的__FILE__、__LINE__和#line

    原文链接 xff1a http hi baidu com 419836321 blog item fcf5ceec484681cfb31cb1f7 html C语言中的 FILE 用以指示本行语句所在源文件的文件名 xff0c 举例如下 x
  • PX4 SITL MAVROS速度控制-用机身坐标系发布速度

    不改变PX4控制双闭环源码 xff0c 仅依靠mavros现有的速度控制和位置控制话题 xff0c 来实现旋翼圆形轨迹 1 位置控制 xff1a mavros setpoint position local 优点 xff1a 位置准确 xf
  • 用java简单的实现单链表的基本操作

    此代码仅供参考 xff0c 如有疑问欢迎评论 xff1a package com tyxh link 节点类 public class Node protected Node next 指针域 protected int data 数据域
  • 算法:海量日志数据,提取出某日访问百度次数最多的那个IP

    首先是这一天 xff0c 并且是访问百度的日志中的IP取出来 xff0c 逐个写入到一个大文件中 注意到IP是32位的 xff0c 最多有个2 32个IP 同样可以采用映射的方法 xff0c 比如模1000 xff0c 把整个大文件映射为1
  • 使用JUnit测试预期异常

    开发人员常常使用单元测试来验证的一段儿代码的操作 xff0c 很多时候单元测试可以检查抛出预期异常 expected exceptions 的代码 在Java语言中 xff0c JUnit是一套标准的单元测试方案 xff0c 它提供了很多验
  • BlockingQueue深入分析

    1 BlockingQueue 定义的常用方法如下 抛出异常特殊值阻塞超时插入add e offer e put e offer e time unit 移除remove poll take poll time unit 检查element
  • Qt对directshow的封装

    在源码路径中 xff1a qt everywhere opensource src 5 1 1 qtmultimedia src plugins directshow xff0c 有两个文件夹player 和 camera xff0c 1
  • 聚合类新闻客户端产品功能点详情分析

    产品功能点 功能 今日头条 百度新闻 鲜果 ZAKER 媒体订阅 个性化内容推荐 个性化订阅 RSS 视频新闻 评论盖楼 搜索新闻 离线下载 地方新闻 一键分享 收藏 推送 天气 夜间模式 线上活动 主题设置 感兴趣 语音读文章 字体设置
  • 聚合类新闻客户端初体验

    初体验的产品 xff1a 今日头条 ios3 6 百度新闻 ios4 4 0 ZAKER ios4 4 5 鲜果 ios3 8 7 中搜搜悦 ios4 0 1 Flipboard ios2 3 9 1 Flipboard 一款国外很火的ap
  • 聚合类新闻客户端的改进

    zaker和鲜果是最早的聚合类新闻产品 xff0c 前几年发展很快 xff0c 迅速占领了市场 xff0c 但近两年发展变得缓慢 xff0c 而今日头条自发布以来才两年 xff0c 用户量就迅速超过了zaker和鲜果 xff0c 使用起来非
  • 单例模式优缺点

    主要优点 xff1a 1 提供了对唯一实例的受控访问 2 由于在系统内存中只存在一个对象 xff0c 因此可以节约系统资源 xff0c 对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能 3 允许可变数目的实例 主要缺点 xff
  • 适配器模式优缺点

    优点 xff1a 1 将目标类和适配者类解耦 2 增加了类的透明性和复用性 xff0c 将具体的实现封装在适配者类中 xff0c 对于客户端类来说是透明的 xff0c 而且提高了适配者的复用性 3 灵活性和扩展性都非常好 xff0c 符合开
  • Oracle 的 Round函数

    Round函数用法 xff1a 截取数字 格式如下 xff1a ROUND xff08 number decimals xff09 其中 xff1a number 待做截取处理的数值 decimals 指明需保留小数点后面的位数 可选项 x
  • eclipse报错:Failed to load the JNI shared library

    电脑自装系统以来 xff0c 好久没有写java代码了 xff0c 所以一直也没用 eclipse IDE xff0c 今天将eclipse打开 xff0c 报了个问题 xff0c Failed to load the JNI shared
  • 10串口通信

    51单片机学习记录10 通信通信的的基本概念串口参数及时序图常用通信接口比较 51单片机串口介绍串口通信简介串口内部结构串口通信相关寄存器 串口通信实验串口向计算机发送数据计算机通过串口控制LED 通信 通信的的基本概念 通信的方式 通信方

随机推荐

  • 【已解决】zookeeper配置出现问题合集

    已解决 zookeeper配置出现问题合集 1 问题诊断 日志2 问题解决合集2 1zookeeper集群搭建报错 拒绝连接 2 2zookeeper集群搭建报错 没有找到主机路由 1 问题诊断 日志 1 进入文件查看日志 xff1a zo
  • noVNC 安装、配置与使用

    最近项目中使用到了远程终端操控 xff0c 从各方找到了noVNC这个神奇的家伙 xff0c 废话不多说 xff0c 开始介绍它的安装配置与使用 1 下载noNVC 好多渠道可以下载到noVNC xff0c 可以直接访问noVNC的官方网页
  • 360极速浏览器网页保护色

    方法一 xff1a 360浏览器的 扩展中心 有一个 绿色眼睛 的插件 xff1b 但是感觉一般 xff0c 不够彻底 xff1b 方法二 xff1a 360急速浏览器是基于开源Chrome浏览器修改的 xff0c 所以可以直接用Chrom
  • STM32基于FreeRTOS的多任务程序案例

    STM32基于FreeRTOS的多任务程序案例 一 初步了解FreeRTOS二 实验要求三 基于FreeRTOS的多任务程序案例四 参考链接 使用工具 野火stm32mini开发板 Keil uVision5 野火多功能调试助手 一 初步了
  • 【TcaplusDB知识库】TcaplusDB刷新tbus通道介绍

    命令 xff1a RefreshBusCfg 其中 xff0c 指进程的进程id xff0c 比如1 2 2 2 1 2 1 2等 xff0c 也支持简单的正则表达式 xff0c 比如RefreshBusCfg 1 2 2 那么只要匹配到1
  • Python中下划线的5种含义

    作者 xff1a 地球的外星人君 链接 xff1a https zhuanlan zhihu com p 36173202 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业转载请注明出处 分享一篇文章
  • ubuntu下 安装PX4编译环境

    最近博主的ubuntu虚拟机再次崩溃 xff0c 狠下决心将4G内存升级为12G 这样就可以给虚拟机多分配些内存了 鉴于前两次安装PX4环境出现了很多错误 xff0c 走了很多弯路 xff0c 没有一一记录下来 xff0c 所获甚少 故而借
  • PX4原生固件,position_estimator_inav解读

    INAV integrated navigation组合导航 对于多旋翼的位置姿态估计系统 xff1a PX4原生固件如今已经默认使用EKF2了 xff0c 另一种情况是 使用local position estimator attitud
  • FusionCharts Free (FCF) 版本 v3.0 更新细节

    版本 v3 0 更新细节 1 新的图表类型 滚动图 柱二维 xff0c 二维和区系的二维 xff0c 堆栈柱二维 xff0c 二维结合 xff0c 结合二维 xff08 双 Y 轴 xff09 样图 样条区域图 对数坐标图 二维多图单 组合
  • dwm-1000 测距总是出现 #define SYS_STATUS_RXPTO 0x00200000UL /* Preamble detection timeout */

    ex 05b ds twr resp 程序 总是出现 致使官方的代码 无法实现通讯 define SYS STATUS RXPTO 0x00200000UL Preamble detection timeout 需要着重修改参数
  • VNC远程桌面到linux,提示connection refused(10061)解决办法

    确认server端的VNC服务开启 xff0c service vncserver start xff0c 检测状态时ok的 ps ef grep vnc xff0c 来查看不是已经开启多个vnc连接 如果有多个vnc连接 xff0c 使用
  • uio驱动框架

    核心 xff0c 利用mmap进行映射 参考资料 uio 编写实例 1 https blog csdn net wujiangguizhen article details 12453253 uio编写实例 2 https blog csd
  • enum类型被intent所携带时需要注意的地方

    一般我们在Activity之间传递对象时多用Parcelable 比如写一个class xff0c 在这个class上标明implements Parcelable并实现接口就可以用Intent putExtra String Parcel
  • dump文件,windbg

    dump文件 xff0c 在VC中的调试还是非常非常非常有用的 xff0c 因为我们也不会经每一行代码都加上日志 xff0c 当然如果你愿意 xff0c 也可以每一行都加上日志 xff1b 在Windows上 xff0c 添加dump文件有
  • 使用PyQt4制作一个音乐播放器(1)

    1 前言 最近用Python给老妈写了一个处理excel表格的小软件 xff0c 因为自己平时用Python一般都是用在数值计算领域 xff0c 所以一般使用命令行的方式交互即可 但是给老妈用发现用命令行交互方式使用并不是很方便 xff0c
  • AI 到底是怎么「想」的?

    本文作者 xff1a kurffzhou xff0c 腾讯 TEG 安全工程师 最近 xff0c Nature发表了一篇关于深度学习系统被欺骗的新闻文章 xff0c 该文指出了对抗样本存在的广泛性和深度学习的脆弱性 xff0c 以及几种可能
  • 效能优化实践:C/C++单元测试万能插桩工具

    作者 xff1a mannywang xff0c 腾讯安全平台后台开发 研发效能是一个涉及面很广的话题 xff0c 它涵盖了软件交付的整个生命周期 xff0c 涉及产品 架构 开发 测试 运维 xff0c 每个环节都可能影响顺畅 高质量地持
  • tensowflow报错tensorflow.python.framework.errors_impl.InvalidArgumentError<exception str

    tensorflow用于自己的数据集时 xff0c 在用saver restore导入模型到Session中 xff0c 导入语句报错 xff0c 异常链终止时提示 xff1a tensorflow python framework err
  • 详解HTTP中的摘要认证机制

    在上一期http blog csdn net tenfyguo article details 6167190中笔者较为详细的介绍了HTTPBasic认证在apache下的配置 xff0c 通过简单的实验演示了HTTP Basic认证的基本
  • 【ubuntu(Linux)安装Vs code并配置c++编译及cmake多文件编译】

    目录标题 VS code配置c 43 43 编译环境1 Linux系统安装2 在Ubuntu中安装VS code2 1 首先下载对应系统的VS code安装包2 2 安装VS code 3 在ubuntu系统下的vscode中配置g 43