当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
视频的学习地址:这里。
x86_64-posix-seh
名称==cmake tools==(一定装)(它的作用是使用第三方库时,方便进去看源码,如果禁用掉,第三方库在平时编辑时就点不进去,下面还会有红色的波浪线)它里面还有两个参数设置
Configure On Edit 打开的话,一修改CMakelests.txt,就会自动cmake(搜索这个选项,然后在Cmake Tools中)
Configure On Open 打开的话,vscode一打开新文件夹,就会自动cmake配置,会自动创建一个build文件夹,然后让你选择使用哪种编译器: 注意:以下三种都是可以的,自动cmake后,点最下面状态栏的运行符号:triangular_ruler:就会自动编译,接着自动运行或debug(且都不需要写task.json和launch.json文件):
选择mingw的gcc,就会自动生成MinGW Makefiles;
选择侦测到的vs,就会生成.sln的项目;
若想生成vs的NMake Makefiles文件,就去修改这个json文件“C:\Users\Administrator\AppData\Local\CMakeTools\==cmake-tools-kits.json==”,仿照mingw的写法添加一个就好了,这里加一个参考示例吧:
{
"name": "cl NMake Makefiles - amd64",
"compilers": {
"C": "D:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\Hostx64\\x64\\cl.exe",
"CXX": "D:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\Hostx64\\x64\\cl.exe"
},
"preferredGenerator": {
"name": "NMake Makefiles"
},
"environmentVariables": {
"CMT_MSVC_PATH": "D:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\VC\\Tools\\MSVC\\14.16.27023\\bin\\Hostx64\\x64"
}
},
Tips: name自己起;C/CXX路径都是给到cl.exe的路径;name值注意;要用x86,就添加一个新的x86的路径。这个”CMT_MSVC_PATH”属性名字乱起的,在那时没发觉其用处(因为只是添加cl.exe所在路径是没有的,只能通过vs自来的cmd进来)。
针对Administrator这个用户免密远程的话:
看C:\Users\Administrator\.ssh 路径下是否有秘钥id_rsa之类的,没有的话就生成一个(参见linux.md中的ssh免密或是git中的ssh免密)
vscode中安装插件==Remote-SSH==,选择右边的 Remote Explorer ,然后打开Configure ,再选择
C:\Users\Administrator\.ssh\config
然后改成以下内容:
Host 2080Ti # 起的别名
HostName 192.168.108.218 # IP地址
User root # 用户名
IdentityFile C:\Users\Administrator.ssh\id_rsa
Tips:如果出错,按这两步去尝试修正一下
使用时的一个错误:
vscode远程开发时,CMakeLists.txt中已经把添加头文件路径写好了的,编译运行过的项目可能没问题,但是刚开始写时,总是会在找头文件时报红线,这样就没有智能提示,就在“.vscode”文件夹下添加这两个json文件用来配置智能提示:
c_cpp_properties.json
{
"configurations": [
{
"name": "Linux",
// 主要就是把那些找不到的头文件的路径手动写进来,方便提示,与CMakeLists.txt没有任何关系。总之写的时候,哪个头文件下报红线,就把它的路径添加进来
"includePath": [
"${workspaceFolder}/**",
"/usr/local/cuda/include",
"/opt/opencv-4.5.3/install/include/opencv4"
],
"defines": [],
"compilerPath": "/opt/rh/devtoolset-8/root/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}
settings.json:这个就放进去吧,也是为了方便智能提示,具体作用咋生效不是很清楚。
{
"files.associations": {
"*.cpp": "cpp",
"iosfwd": "cpp",
"unordered_map": "cpp",
"array": "cpp",
"atomic": "cpp",
"hash_map": "cpp",
"hash_set": "cpp",
"strstream": "cpp",
"*.tcc": "cpp",
"bitset": "cpp",
"cctype": "cpp",
"chrono": "cpp",
"cinttypes": "cpp",
"clocale": "cpp",
"cmath": "cpp",
"codecvt": "cpp",
"complex": "cpp",
"condition_variable": "cpp",
"csignal": "cpp",
"cstdarg": "cpp",
"cstddef": "cpp",
"cstdint": "cpp",
"cstdio": "cpp",
"cstdlib": "cpp",
"cstring": "cpp",
"ctime": "cpp",
"cwchar": "cpp",
"cwctype": "cpp",
"deque": "cpp",
"forward_list": "cpp",
"list": "cpp",
"unordered_set": "cpp",
"vector": "cpp",
"exception": "cpp",
"algorithm": "cpp",
"functional": "cpp",
"iterator": "cpp",
"map": "cpp",
"memory": "cpp",
"memory_resource": "cpp",
"numeric": "cpp",
"optional": "cpp",
"random": "cpp",
"ratio": "cpp",
"regex": "cpp",
"set": "cpp",
"string": "cpp",
"string_view": "cpp",
"system_error": "cpp",
"tuple": "cpp",
"type_traits": "cpp",
"utility": "cpp",
"fstream": "cpp",
"future": "cpp",
"initializer_list": "cpp",
"iomanip": "cpp",
"iostream": "cpp",
"istream": "cpp",
"limits": "cpp",
"mutex": "cpp",
"new": "cpp",
"ostream": "cpp",
"sstream": "cpp",
"stdexcept": "cpp",
"streambuf": "cpp",
"thread": "cpp",
"cfenv": "cpp",
"typeindex": "cpp",
"typeinfo": "cpp",
"valarray": "cpp",
"variant": "cpp",
"__nullptr": "cpp"
}
}
简单的使用而不是用cmake的话,就是直接打开一个terminal,然后正常的使用g++命令直接编译构建可执行文件、运行就好了。
下面主要讲下cmake的使用:
CMakeLists.txt
文件,里面就简单两行
Ctrl+Shift+p
,输入cmake
,一般就是选择第一个的Configure
,再选自己装的GCC版本就好了(这一步第一次有,后面可能就没了);cd build
、cmake ..
、mingw32-make.exe
// 跟linux不太相同的是第三步的make,window下是用的这个命令,一定注意
cmake -G "MinGW Makefiles" ..
代替cmake ..
(仅第一次这样,后面就可以cmake了,不行的话就还是用这命令吧)3.1.1 ==单个==.cpp文件的debug
create a lunsh.json file
,再选择带GBD
那个,再就是选择g++.exe
那个(这里有可能不会有这个选择,就生成其它模板再改就好了),然后系统就会自动生成相关的配置的json文件,在同级.vscode
;3.1.2 ==多个==.cpp文件的dubug
launch.json
、tasks.json
文件,但这是不能成功运行的,因为它是自动生成的,都是按照默认的名字来的,是不对的,接下来就去修改launch.json
:
"program"
这一项,它就是指向我们生成的my_main
执行文件,于是我们改成"program": "${fileDirname}/my_main.exe"
(其中${fileDirname}
是当前文件目录,也就是”cwd”对应的值);还要把最下面那项目"preLaunchTask"
给注释掉(这是不对的,下面会说到),因为它是默认生成命令,针对单文件可用。preLaunchTask
,对源cpp文件修改后,调试却还是按照上次展示,因为,我们没有使用"preLaunchTask"
,不会自动编译新的可执行文件,tasks.json
文件,它就是来负责重新编译,而preLaunchTask就是与之沟通的路径
tasks.json
,就先Ctrl+Shift+p
,输入tasks
,选择Configure Task
,再选择带有g++
的,就会生成tasks.json
;tasks.json
,主要就是"args"
,把里面的内容改成用终端g++编译时需要的参数,输入的文件名及路径要跟launch.json
中的"program"
一致;launch.json
最后一行的"preLaunchTask"
放开,且主要这个内容也要跟tasks.json
的"label"
里的内容保持一致。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保持一致
}
]
}
可能要自己写launch.json
和tasks.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:
miDebuggerPath
的值是gdb
软件的路径,这个路径里是不能用大写字母的,那怕真实路径里有大写字母,也要手动改成小写的。这个主要是把参数的注释写的比较全,用的时候,或者发给别人的时候,用上面的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",
}
]
}
{
// 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:
workspaceFolder
代表的是这个项目总文件夹的路径,应该所有文件用这个都是一样的;fileDirname
是当前正在编辑的文件的路径,不同文件之间可能是有出入的; 这个其实意义不大,很简单,完全可以不看,但还是放这里,后续要复现的话,快速复制过去就行。
swap.h
void swap(int &, int &);
swap.cpp
#include "swap.h"
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
main.cpp
#include <iostream>
#include "swap.h"
int main(int argc, char **argv) {
std::cout << "hello world" << std::endl;
int a = 13, b = 14;
std::cout << "交换前:" << std::endl;
std::cout << a << "\n";
std::cout << b << "\n";
swap(a, b);
std::cout << "交换后:" << std::endl;
std::cout << a << "\n";
std::cout << b << "\n";
std::cout << "执行到这里了" << std::endl;
return 0;
}
点击插件那里,有一个local,下面应该还有SSH:2080Ti-INSTALLED,需要在这里面安装上差不多跟local中一样的python,c++插件才会让debug,可能不好装。我这次也是偶然点出来的就都装上了,主要是点了一个C++的,Add to Workspace Recommendations
更新:一定要在远程的ssh上安装上C/C++ Extension Pack,这个插件,就搜索起来,多点多试试。
建议:以一个远程项目为一个文件地址远程打开,进行调试,不要远程到/home下,再逐步点到项目里去,因为vscode调试时会创建一个.vscode
文件夹,它会放在你最开始远程的路径下,所以为了避免各项目之间的感染,就还是把.vscode创建在项目各自的目录下。
可能出现的问题:远程时,可能断点都打不了,按下F5也都直接报错,那就点这个错误,把python那个Extension卸载了,再重新装,然后再试,一般就可以了。
更改环境,anaconda下有很多环境,在vscode远程窗口左下角可以更改选择具体的环境。当然也可以直接在.vscode目录下修改或是直接添加settings.json
文件,内容如下:
{
"python.pythonPath": "/root/root/anaconda3/envs/yolact_edge/bin/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"
]
}
]
}
和python基本是一样的,也是以一个远程项目为一个文件地址远程打开。
注意点:每一次修改代码后,按F5开始debug时,会重新make编译,但是因为anaconda环境问题,make可能不会成功,即便从$LD_LIBRARY_PATH中把anaconda相关去掉,自动make还是因为这个失败(这是因为它还在/etc/ld.so.conf.d加入了相关路径,并且这个在$LD_LIBRARY_PATH是不会现实出来的),所以改了代码后,还是自己先在bash中make后,再debug。
现在已经可以远程调试了,还看到一个gdb-server,没用过,暂时放这里,这里吧。
去看docker里面,有详细的说明。下面是以前写的,
我这里并没有用网上说的Remote X11,还是依靠的Xmanger来实现的:
这样子,无论是在xshell中还是vscode远程,运行都能自动调用xmanger来显示图像。(后面的数字,10、11、12都试过,都可以,但是13就不行,不知道为啥)。
除了使用vscode的这种方式debug,windows中还有一个微软出的专门的debug工具,叫做==WinDbg==,了解一下,可看这里。
在windows下也是可以直接用命令行编译vs的Makefile,而不是.sln工程的:
环境准备:
首先把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”
编译:
注意:nmake 命令其实就是 nmake.exe ,它跟cl.exe在一起,所以要加环境变量才用直接使用。
以上是一种原理,了解一下挺好,但是要直接快速使用,还是按照我写的这个博客来操作。
5.1中的操作就是win下命令行的编译,用的是msvc的编译器和库,这种就可以直接只用windows下opencv已经编译好的MSVC版本(特别注意:这个已经编译好的版本,win下的mingw是不能使用的),vscode中如下操作:
注意点:一般就这可以开始debug了,但是同样无法在修改代码后自主nmake,原因跟4.3有些类似,这个需要特定的cmd(即执行了那个.bat脚本的),vscode自主编译时会新建一个powershell就肯定会编译失败,我也尝试把脚本的执行加进tasks.json,验证过了是不行的; 所以同理,一般debug时,就是编译好了的程序,如果有改代码,先去到那个一开始已经弄好的cmd中nmake编译好了先,然后再debug,改一下代码,这样子做一次。
这样子做的两个实例json:
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "cl.exe - 生成和调试活动文件",
"type": "cppvsdbg",
"request": "launch",
"program": "${workspaceFolder}/build/bin/eyeLike.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"console": "externalTerminal",
"preLaunchTask": "C/C++: cl.exe 生成活动文件"
}
]
}
tasks.json
{
"version": "2.0.0",
"options": {
"cwd": "${workspaceFolder}/build" // 注意这里是 workspaceFolder
},
"tasks": [
{
"label": "cmake",
"type": "shell",
"command": "cmake",
"args": [
"-G",
"NMake Makefiles",
".."
]
},
{
"label": "nmake",
"group": {
"kind": "build",
"isDefault": true,
},
"command": "nmake",
"args": [
]
},
{
"label": "C/C++: cl.exe 生成活动文件", // 这里和laubch.json的`preLaunchTask`值保持一致
"dependsOn": [
"cmake",
"nmake"
]
}
]
}
描述:根据群里看到,断点开始debug后,并不显示当前代码里的局部变量。
解决办法:在launch.json中添加一行==”justMyCode”:false==。
先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”,然后点击后面的设置图标就能进来修改内容了。