note

当vscode来编辑器,当出现.dll动态库找不到的时候,就搜索一下,然后将其所在的路径添加到环境变量中就好了。

运行python程序时,它的python debug console终端太丑了,在setting.json里加这么一行就行了: “terminal.integrated.automationShell.windows”: “cmd.exe”,

.bat文件,最后一行可以加一个 pause 这样终端就是vs的那种停住,按任意键运行。

编译:

Tips:如果不加参-G,win上会直接生成vs的.sln项目,配置这些还不好搞,这样的话更好的选择就是直接使用cmake-gui。

namke想要开启多核编译的话:

set CL=/MP # 这样设置环境变量,同时编译多个文件 nmake

VSCode的C/C++开发 ===> Windows

0. 常用习惯设置

视频的学习地址:这里


1. 开发环境搭建

vscode远程服务器配置

针对Administrator这个用户免密远程的话:

Tips:如果出错,按这两步去尝试修正一下

使用时的一个错误:

c_cpp_properties.json

​ vscode远程开发时,CMakeLists.txt中已经把添加头文件路径写好了的,编译运行过的项目可能没问题,但是刚开始写时,总是会在找头文件时报红线,这样就没有智能提示,就在“.vscode”文件夹下添加这两个json文件用来配置智能提示:

2. 使用cmake构建项目

​ 简单的使用而不是用cmake的话,就是直接打开一个terminal,然后正常的使用g++命令直接编译构建可执行文件、运行就好了。

下面主要讲下cmake的使用:

3. vscode下的debug

3.1 普通命令编译项目

3.1.1 ==单个==.cpp文件的debug


3.1.2 ==多个==.cpp文件的dubug


3.1.3 示例json文件

​ 这里相当于是模仿终端直接使用g++编译的方式,每次debug的时候要是有修改,就会执行tasks.json,它就会自动帮我们编译,就方便直接debug。

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "C/C++: g++.exe 生成活动文件123",
			"command": "D:\\program files\\mingw64\\bin\\g++.exe",
			"args": [     // 给的是编译时的参数
				"-g",
				"main.cpp",
				"swap.cpp",
				"-o",
				"${fileDirname}\\my_main.exe"
			],
			"options": {
				"cwd": "${fileDirname}"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build",
			"detail": "编译器: \"D:\\program files\\mingw64\\bin\\g++.exe\""
		}
	]
}
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++.exe - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/my_main.exe",   // 注意这里的路径名
            "args": [],   // 这里是给程序执行时输入的参数
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",  // 项目所在的路径;${fileDirname}是当前文件所在路径
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "D:\\program files\\mingw64\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++.exe 生成活动文件123"  // 这里跟tasks.json的label保持一致
        }
    ]
}

3.2 cmake构建项目

可能要自己写launch.jsontasks.json,有时候快捷键设置出不来g++的tasks,下面给的例子:

主要针对win下使用mingw的配置示例,主要是launch.json中miDebuggerPath路径的不同,所以特意拿出来,然后tasks.json都是一样的:

launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "这是随意放的一个",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/build/my_cmake.exe",
            "args": ["-i", '123.mp4'],     // 这里是给程序执行时输入的参数,多个就用逗号隔开
            "stopAtEntry": false,
            "cwd": "${fileDirname}",       // 这里是fileDirname还是workspaceFolder都无伤大雅
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            // "miDebuggerPath": "D:\\Program Files\\mingw64\bin\\gdb.exe",   // 这是错的;这路径虽然是对的,但是不能有大写,不然就不行
            "miDebuggerPath": "D:\\program files\\mingw64\\bin\\gdb.exe",  
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "this_name_should_be_same"   // 注意
        }
    ]
}

Tips:

launch.json

这个主要是把参数的注释写的比较全,用的时候,或者发给别人的时候,用上面的launch.json,一样的

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {	
            // 配置名称,将会在启动配置的下拉菜单中显示(可随意)
            "name": "g++ - Build and debug active file",  
            // 配置类型,对于C/C++可认为此处只能是cppdbg,由cpptools提供;不同编程语言不同
            "type": "cppdbg",  
            "request": "launch",  // 可以为launch(启动)或attach(附加)
            "program": "${workspaceFolder}/build/yolov5_video", // 可执行文件的绝对路径
            // 可执行文件后跟的参数(文件是相对路径)
            // 如果最后给的rtsp地址,这里 & 符号前要加转义才行,
            // 如:"rtsp://192.168.108.132:554/user=admin\\&password=\\&channel=1\\&stream=0.sdp?"
            "args": ["-d", "my_v5l.engine", "../123.mp4"],  
             // 设为true时程序将暂停在程序入口处,相当于在main上打断点
            "stopAtEntry": false, 
            
            "cwd": "${workspaceFolder}/build",  // 为了上面args后面的参数可以使用路径
            "environment": [     // 加环境变量,必须是这种格式
                {"name": "DISPLAY", "value": "192.168.108.147:0.0"}, 
                {"name": "abc", "value": "a_test"}
            ],
            // true:就是使用单独的cmd窗口;false:使用内置终端(有显示不全的可能)
            "externalConsole": false, 
            
            "MIMode": "gdb",  // 指定连接的调试器,可以为gdb或lldb。但我没试过lldb
            "miDebuggerPath": "/usr/bin/gdb",    // gdb的路径
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
    		// 这里的值跟tasks.json的label保持一致
            "preLaunchTask": "C/C++: g++ build active file",
        }
    ]
}

tasks.json

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "options": {
        "cwd": "${workspaceFolder}/build"   // 注意这里是 workspaceFolder
    },
    "tasks": [
        {
            "label": "cmake",
            "type": "shell",
            "command": "cmake",
            "args": [
                ".."
            ]
        },
        {
            "label": "make",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "command": "make",
            "args": [

            ]
        },
        {
            "label": "C/C++: g++ build active file",  // 这里和laubch.json的`preLaunchTask`值保持一致
            "dependsOn": [
                "cmake",
                "make"
            ]
        }
    ]
}

Tips:

3.4. 学习过程的代码

​ 这个其实意义不大,很简单,完全可以不看,但还是放这里,后续要复现的话,快速复制过去就行。

4. 远程调试

​ 点击插件那里,有一个local,下面应该还有SSH:2080Ti-INSTALLED,需要在这里面安装上差不多跟local中一样的python,c++插件才会让debug,可能不好装。我这次也是偶然点出来的就都装上了,主要是点了一个C++的,Add to Workspace Recommendations

​ 更新:一定要在远程的ssh上安装上C/C++ Extension Pack,这个插件,就搜索起来,多点多试试。

4.1 python

==终端带参数的输入调试==,步骤如下:

Run—>Open Configurations—>Python—>Python File

然后它就会自动生成launch.json文件,然后就再手动加入自己终端输入要添加的参数,然后就可以去debug了:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${workspaceFolder}/my_yolov5_trt_video.py",
            "console": "integratedTerminal",
            "justMyCode": true,   // 酌情看要不要这一项
            "args": [
                "--trained_model", "123.pth",
                "--score_threshold", "0.3",
                "--top_k", "10",
                "--display"
            ]
        }
    ]
}

4.2 c++

和python基本是一样的,也是以一个远程项目为一个文件地址远程打开。

注意点:每一次修改代码后,按F5开始debug时,会重新make编译,但是因为anaconda环境问题,make可能不会成功,即便从$LD_LIBRARY_PATH中把anaconda相关去掉,自动make还是因为这个失败(这是因为它还在/etc/ld.so.conf.d加入了相关路径,并且这个在$LD_LIBRARY_PATH是不会现实出来的),所以改了代码后,还是自己先在bash中make后,再debug。

现在已经可以远程调试了,还看到一个gdb-server,没用过,暂时放这里这里吧。

4.3 远程显示图像

去看docker里面,有详细的说明。下面是以前写的,

我这里并没有用网上说的Remote X11,还是依靠的Xmanger来实现的:

这样子,无论是在xshell中还是vscode远程,运行都能自动调用xmanger来显示图像。(后面的数字,10、11、12都试过,都可以,但是13就不行,不知道为啥)。

5. vscode生成、调试vs的程序

​ 除了使用vscode的这种方式debug,windows中还有一个微软出的专门的debug工具,叫做==WinDbg==,了解一下,可看这里

5.1 win下编译

在windows下也是可以直接用命令行编译vs的Makefile,而不是.sln工程的:

  1. 环境准备:

    • 首先把vs的编译器==cl.exe==加入到环境变量,一般它的路径如下(注意使用64的)(这也不是必须,因为执行下面的.bat后,环境都会弄好):

      • D:\Program Files (x86)\MicrosoftVistualStudio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64
    • 然后==必须用cmd==,不能是powershell(用它就是不行,试过很多次了),然后在cmd中,直接输入执行如下.bat文件:

      • "D:\Program Files (x86)\MicrosoftVistualStudio\2017\Community\VC\Auxiliary\Build\vcvars64.bat"(记得一定要这对引号),

      完成环境初始化(这其实就是菜单中vs的工具提示符),然后就可以在这个cmd中进行编译操作了。

    Tips:

    • vscode中,可以配置自己的终端,可以在自定义终端中,不用source来继承一个终端的配置,而是直接使用

      // 注意,以下只是其中的一部分
      "my_msvc": {
          // "path": "C:\\Windows\\System32\\cmd.exe",
          "path": "D:\\Program Files (x86)\\MicrosoftVistualStudio\\2017\\Community\\VC\\Auxiliary\\Build\\my_msvc.bat\",
          "args": []
      }
      
      • 这个path路径就是上面vcvars64.bat所在路径,我只是在那里面写了一个名为“my_msvc.bat”的文件,里面的内容为:(只是在vcvars64.bat内容后加了一行cmd,不然新打开的终端总是会闪退,先是试着不加。)

        @call "%~dp0vcvarsall.bat" x64 %*
        cmd
        

        也可以给绝对路径写到bat文件中:@call “D:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat”

  2. 编译:

    • cmake -G “NMake Makefiles” ..
    • nmake

注意:nmake 命令其实就是 nmake.exe ,它跟cl.exe在一起,所以要加环境变量才用直接使用。

以上是一种原理,了解一下挺好,但是要直接快速使用,还是按照我写的这个博客来操作。

5.2 debug

​ 5.1中的操作就是win下命令行的编译,用的是msvc的编译器和库,这种就可以直接只用windows下opencv已经编译好的MSVC版本(特别注意:这个已经编译好的版本,win下的mingw是不能使用的),vscode中如下操作:

  1. 环境准备:
    • vscode可能会自主选择一个编译器进行自动编译,但是要么是mingw,要么是生成vs的.sln工程,没办法生成NMake的makefile,我们也没法办指定,就只能把让其先生成(主动或是被动),再删除掉build文件下除了==.cmake==文件夹的所有文件;
    • 新建一个cmd终端(一定要cmd),然后在里面执行==vcvars64.bat==这个脚本,参照5.1。(或者直接在vs自带的cmd中输入code来运行vscode)
  2. 编译:
    • cmake -G “NMake Makefiles” ..
    • nmake
  3. debug:
    • 点debug的图标,创建lacun.json文件,选择==C++(Windows)==,再点cl.exe,把生成的launch.json中的program项目改成程序所在位置就可以了;
    • 再手动创建一个tasks.json,内容见下。

​ 注意点:一般就这可以开始debug了,但是同样无法在修改代码后自主nmake,原因跟4.3有些类似,这个需要特定的cmd(即执行了那个.bat脚本的),vscode自主编译时会新建一个powershell就肯定会编译失败,我也尝试把脚本的执行加进tasks.json,验证过了是不行的; ​ 所以同理,一般debug时,就是编译好了的程序,如果有改代码,先去到那个一开始已经弄好的cmd中nmake编译好了先,然后再debug,改一下代码,这样子做一次。

这样子做的两个实例json:

6. 可能遇到的问题

不显示局部变量

​ 描述:根据群里看到,断点开始debug后,并不显示当前代码里的局部变量。

​ 解决办法:在launch.json中添加一行==”justMyCode”:false==。

7. 获取变量代表的值task.json

先ctrl+shift+p,然后输入==run task==,一般第一次会让创建一个task.json,然后在里面写上这些验证内容:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "my_msvc",
            "type": "shell",
            "command": "echo",
            "args": [
                "${workspaceFolder}"
            ],
        }
    ]
}

然后在ctrl+shift+p,选择run task来执行就可以获得${workspaceFolder}变量是什么,也可以直接在command中直接写上==”command”: “echo ${workspaceFolder}”==,也可以是其它的要执行的命令。

如果要改task.json中的内容,一般是在第二次往后可能会用到,在输入run task选择后,就会出现第一次配置的task.json的名字,这个例子就是上面的“my_msvc”,然后点击后面的设置图标就能进来修改内容了。