VSCode配置C++开发环境:OpenCV

2023-11-13


最近在做深度学习的C++部署相关工作,于是写下这篇文档记录环境配置的过程。环境配置是一项非常繁琐的工作,无论从大学做相关作业还是到工作上。做这项工作需要技术的同时,还需要点运气。当然遇到无法解决的玄学问题,最终只有一个办法:重启设备。

本篇文章以环境为设置分为两个环境进行部署,一个是Linux和Win10部署的部分。Linux部分部署时因为无论是端侧部署应用还是服务端部署应用都会涉及到Linux。而Windows部署则是为了方便我在自己笔记本上进行学习练习才记录下来的。那么现在就开始我们的环境配置部署之路。

无论是Linux还是Win10环境,先写一个测试的​hello world代码:

#include<iostream>
using namespace std;
int main(){
    cout<<"hello world"<<endl;
}

Linux

我的Linux版本是:Linux ubuntu 5.15.0-56-generic #62-Ubuntu SMP Tue Nov 22 19:54:14 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux。通过Win10设备上的VSCode连接到服务器上的。要配置C++环境,那么要先把vscode上的C++扩展安装好,如下图所示:
在这里插入图片描述
在配置好vscode的环境后,需要在当前项目的.vscode文件夹下配置task.jsonlaunch.jsonc_cpp_properties.json文件,其中task.json用于编译器配置,launch.json用于调试器设置,c_cpp_properties.json用于编译器路径和IntelliSense设置。

编译

新建task.json文件,该文件是告诉vscode如何编译程序,大概用途是使用g++编译器编译源文件为可执行文件。task内容如下:

{
    "version": "2.0.0",
    "tasks": [
      {
        "type": "shell",
        "label": "g++ build active file",
        "command": "/usr/bin/g++",
        "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
        "options": {
          "cwd": "/usr/bin"
        },
        "problemMatcher": ["$gcc"],
        "group": {
          "kind": "build",
          "isDefault": true
        }
      }
    ]
}

command 变量指定了那个编译器会被使用,这里就是 /usr/bin 目录下的 g++ 编译器;args 这个参数列表给出了我们需要传递给g++编译器的命令参数,需要符合g++命令行的参数顺序,${file} 代表目前编辑器打开的文件,${fileDirname} 代表当前活跃文件的目录,${fileBasenameNoExtension} 为生成的文件名,与被编译的文件名相同。label 变量的值为终端任务中名字,你可以任意修改;group 变量中的 "isDefault":true 代表了当按下Ctrl+Shift+B时,会对当前活跃的文件进行编译,仅仅是为了方便。关于更多的变量定义可以参考:Variables Reference

VS Code打开tmp.cpp 源文件,并处于编辑界面,按下 Ctrl+Shift+B键 (或者在 主菜单->终端->运行生成任务 ),tasks.json 就会被执行。
在这里插入图片描述
运行该文件,输出hello world
在这里插入图片描述
要注意:要让tmp.cpp(即你要编译的文件)处于活跃状态。

调试

调试文件主要使用launch.json文件,该文件配置VS Code下的GDB调试器。GDB调试器安装命令:apt-get install build-essential gdb
launch.json内容:

{
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "g++ build active file",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ],
    "version": "2.0.0"
}

其中,program变量指定你想要调试的文件,这里被设置为活跃文件夹${fileDirname}下的活跃文件${fileBasenameNoExtension},如果tmp.cpp处于活跃, 那么tmp会被调试。默认情况下,C++ 扩展不会添加断点到源文件中,stopAtEntry默认被设置为flase,如果设置为true的话,那么调试器会在main方法入口暂停。

配置OpenCV

如果你需要更多关于 C/C++ 扩展的使用,你可以创建一个c_cpp_properties.json文件,这个可以让你去改变一些设置,例如编译器的路径、C++ 标准等。你可以在 VS Code 中按下 Ctrl+Shift+P键,并在命令行中输入C/C++,可以在下拉菜单中选择C/C++配置,这样在 .vscode文件夹下出现c_cpp_properties.json文件,同时在 VS Code 界面出现一个设置窗口,你可以按照你的需要在里面修改一些 C/C++ 的配置。

要配置opencv,当然要先安装好OpenCV,可参考该文章:笔记—Linux安装OpenCV及VSCode的配置编译实践出真知——Ubuntu 18.04 VSCODE配置OpenCV4.5运行YOLO4模型

新建c_cpp_properties.json文件,内容如下:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/usr/include/opencv2"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

主要是inclodePath要包含opencv头文件的路径。

修改task.json文件,因为需要加入opencv的动态链接库:

{
    "version": "2.0.0",
    "tasks": [
      {
        "type": "shell",
        "label": "g++ build active file",
        "command": "/usr/bin/g++",
        "args": [
          "-g", 
          "${file}", 
          "-o", 
          "${fileDirname}/${fileBasenameNoExtension}",
          "`pkg-config", "--cflags", "--libs", "opencv4`",       
          // "-I", "/usr/local/include",        
          // "-I", "/usr/local/include/opencv4",       
          // "-I", "/usr/local/include/opencv4/opencv2",       
          // "-L", "/usr/local/lib",        
          // "-l", "opencv_core",        
          // "-l", "opencv_imgproc",        
          // "-l", "opencv_imgcodecs",
          // "-l", "opencv_video",        
          // "-l", "opencv_ml",
          // "-l", "opencv_highgui",
          // "-l", "opencv_objdetect",
          // "-l", "opencv_flann",
          // "-l", "opencv_imgcodecs",
          // "-l", "opencv_photo",
          // "-l", "opencv_videoio"
        ],
        "options": {
          "cwd": "/usr/bin"
        },
        "problemMatcher": ["$gcc"],
        "group": {
          "kind": "build",
          "isDefault": true
        }
      }
    ]
}

最终像上述的编译调试运行以下程序代码即可:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(int argc,char** argv){

    std::cout<<"111"<< std::endl;
    cv::Mat src = cv::imread("./src/model_optimize.jpg");
    cv::resize(src,src,cv::Size(500,800));
    imwrite("./test.jpg", src);
    return 0;
}

Win10

要在Win10上调试C++程序,那么就要先安装好MinGW并进行配置。在这一步这里就不展开了。

编译调试

编译调试跟Linux原理差不多,将task.json以及launch.json里面的g++gdb路径配置好即可,文件内容如下:

task.json

{
    "version": "2.0.0",
    "tasks": [
      {
        "type": "shell",
        "label": "g++ build active file",
        "command": "C:/mingw64/bin/g++.exe",
        "args": [
          "-g", 
          "${file}", 
          "-o", 
          "${fileDirname}/${fileBasenameNoExtension}"    
          // "-I", "/usr/local/include",        
          // "-I", "/usr/local/include/opencv4",       
          // "-I", "/usr/local/include/opencv4/opencv2",       
          // "-L", "/usr/local/lib",        
          // "-l", "opencv_core",        
          // "-l", "opencv_imgproc",        
          // "-l", "opencv_imgcodecs",
          // "-l", "opencv_video",        
          // "-l", "opencv_ml",
          // "-l", "opencv_highgui",
          // "-l", "opencv_objdetect",
          // "-l", "opencv_flann",
          // "-l", "opencv_imgcodecs",
          // "-l", "opencv_photo",
          // "-l", "opencv_videoio"
        ],
        "options": {
          "cwd": "C:/mingw64/bin"
        },
        "problemMatcher": ["$gcc"],
        "group": {
          "kind": "build",
          "isDefault": true
        }
      }
    ]
}

launch.json文件如下:

{
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "g++ build active file",
            "miDebuggerPath": "C:/mingw64/bin/gdb.exe"
        }
    ],
    "version": "2.0.0"
}

配置OpenCV

opencv版本:4.6.10。配置OpenCV的工作原理:对OpenCV的源码进行编译,然后在VSCode上进行配置。

(1)源码编译

编译安装的环境:

  • cmake version 3.9.0-rc3
  • mingw 5.3.0

设置好源码路径已经生成路径,点击configure按钮,注意:选择生成MinGW Makefiules,选择Specify native compilers,最后配置你的编译器路径。

在这里插入图片描述
在这里插入图片描述

点击Generate按钮。
在这里插入图片描述
到设置的路径,这里是:C:\opencv\build\x64\mingw下执行:minGW32-make -j8
在这里插入图片描述

执行minGW32-make install

在这里插入图片描述

最后在bin下生成结果,并将C:\opencv\build\x64\mingw\bin配置到环境路径下。

遇到的问题:

  1. 编译生成报如图下的错,因为OpenCV版本太old了。最终更新至4.6.10。
    在这里插入图片描述

解决方案:OpenCV + CLion在windows环境下使用CMake编译, 出现Mutex相关的错误的解决办法

  1. 出现“Unexpected GDB output from command “-exec-run”.”
    在这里插入图片描述
    StackOverFlow上的解决方案:ERROR: Unable to start debugging. Unexpected GDB output from command “-exec-run”. Unable to find Mach task port for process-id 1401

参考

  1. 如何在 Linux 系统中的 VS Code 上配置 C/C++ 环境
  2. VSCode+Opencv(C++)+Win10
  3. VScode搭建OpenCV环境⭐️⭐️⭐️,推荐。
  4. OpenCV使用CMake和MinGW-w64的编译安装⭐️⭐️⭐️,推荐
  5. OpenCV-MinGW-Build:已经编译好的OpenCV库
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VSCode配置C++开发环境:OpenCV 的相关文章

  • 检测到 NuGet 包的版本冲突

    我正在开发 ASP Net core 2 1 Web 应用程序项目 我的解决方案中有 1 个项目和 3 个其他库 它是高级架构 数据访问层 DAL 业务层 BL 公共层 CL 所以我需要添加引用来连接一些库和项目 我已经添加了CL参考我的项
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐

  • php- 静态代码检测

    1 安装 PhpMetrics 可以直接 composer 全局安装 composer global require phpmetrics phpmetrics 安装完毕之后 可以这样来运行命令分析代码复杂度 phpmetrics repo
  • 关于在Unity 中动画的某一帧执行函数

    打开动画的inspector 选择Events 添加一个帧 然后再Function中输入你需要执行的函数名
  • ICS计算机系统大作业

    计算机系统 大作业 题 目 程序人生 Hello s P2P 专 业 计算机学院 学 号 120L020427 班 级 2003004 学 生 易焯平 指 导 教 师 史先俊 计算机科学与技术学院 2022年5月 摘 要 几乎全世界的程序员
  • 通俗理解PCA降维作用

    概述 本文主要介绍一种降维方法 PCA Principal Component Analysis 主成分分析 降维致力于解决三类问题 降维可以缓解维度灾难问题 降维可以在压缩数据的同时让信息损失最小化 理解几百个维度的数据结构很困难 两三个
  • Python设置excel单元格格式

    文章目录 xlwt 模块简介 设置数字的格式 设置字体 设置对齐方式 设置边框 设置 填充 设置保护 xlwt 模块简介 xlwt 是 python中一个用来操作 excel 文件的库 其中 封装了很多常用操作 本文主要讲解使用该库在生成e
  • elememt el-tree使用(样式修改+设置为单选,不含父节点)

    elememt el tree使用 样式修改 设置为单选 不含父节点 最近在使用element做练习 就单纯的想对使用的组件和功能做一下下记录 v 直接在elememt官网找自己想要使用的组件就好 html
  • 【算法提升】——中心扩散法(最长回文子串和回文子串)

    中心扩散法常用来解决回文子串的问题 如最长回文子串和回文子串的问题 最长回文子串 给你一个字符串 s 找到 s 中最长的回文子串 解题思路 从每一个位置确定回文子串中心点 回文子串向两边扩散的起始位置 向左右两边扩散进行比较 如果是 bab
  • LCD 亮度相关(背光) 正负压相关

    LCD 亮度相关 背光 kernel msm 3 18 drivers video msm mdss mdss fb c 调用led classdev register 注册lcd backlight sys class leds lcd
  • Lua的string和string库总结

    Lua有7种数据类型 分别是nil boolean number string table function userdata 这里我总结一下Lua的string类型和string库 复习一下 以便加深记忆 个人认为string是Lua编程
  • 全栈工程师的职业前景及就业环境情况说明

    本篇文章主要讲解全栈工程师的职业前景和就业趋势 作者 任聪聪 日期 2023年4月20日 全栈工程师顾名思义就是会一个技术栈领域的所有客户端技术 如web全栈即前后端技术栈都会的工程师 如web pc app都会的则也是全栈 大全栈 故此全
  • 网络---因特网的概述

    因特网的概述 网络 互联网 因特网 网络 许多计算机连接在一起 互联网 internet 许多网络连接在一起 因特网 全球最大的一个互联网 Internet和广域网 局域网 覆盖范围小 自己花钱买设备 带宽固定 10M 100M 1000M
  • 关于ER图和UML图之间的对比

    ER图与UML图 ER图 实体 联系图 Entity Relation Diagram 用来建立数据模型 在数据库系统概论中属于概念设计阶段 ER图提供了表示实体 即数据对象 属性和联系的方法 用来描述现实世界的概念模型 构成E R图的基本
  • React项目 加入 TS

    1 全局安装ts npm i g typescript 2 创建tsconfig json tsc init 修改tsconfig json 开启jsx和allowJs配置 3 安装开发环境依赖 npm install save dev t
  • 数据分析:Pandas之Series用法总结

    文章目录 Series 一 导入Series 二 创建Series 1 使用列表或者numpy进行创建 默认索引为0到N 1的整数型索引 2 使用字典创建 推荐使用 三 Series的索引和切片 1 显式索引与切片 2 隐式索引与切片 四
  • 域名系统由什么服务器组成,域名(DNS)的有那三个组成部分

    域名制度 域名 DNS 的有那三个组成部分 DNS由下面三个部分组成 域名空间和资源记录 域名空间是一个树状结构 资源记录是与名字相关的一些数据 从概念上说 每个结点和域名空间树的叶子结点都有一定的信息 而查询是要查询出一些与之相关的特定信
  • 辛普森悖论及贝叶斯解释

    辛普森悖论 Simpson s Paradox 亦有人译为辛普森诡论 为英国统计学家E H 辛普森 E H Simpson 于1951年提出的悖论 即在某个条件下的两组数据 分别讨论时都会满足某种性质 可是一旦合并考虑 却可能导致相反的结论
  • leetcode 63. 不同路径 II

    一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为 Start 机器人每次只能向下或者向右移动一步 机器人试图达到网格的右下角 在下图中标记为 Finish 现在考虑网格中有障碍物 那么从左上角到右下角将会有多少条不同的路径
  • ReactNative系列之四十八屏幕宽高

    有几种方式可以获取屏幕 依次来对比下 1 view gt onLayout measure 如果view是flex 1 则获取的为屏幕真正的可显示宽高 即全面屏含刘海高度 安全区模式不含刘海高度 实际 2 Dimens 监听change 在
  • 【实现一套爬虫数据抓取平台】[3-5-03] 微博长短地址转换

    文章目录 零 系列目录 一 背景 二 代码 三 总结 零 系列目录 写这套文章的时候 不会完全按照目录的顺序一篇一篇写 大家可以到目录中直接找到对应的章节进行查看 点我跳转 一 背景 新浪微博有两类地址 分别是 pc站地址 https we
  • VSCode配置C++开发环境:OpenCV

    文章目录 Linux 编译 调试 配置OpenCV Win10 编译调试 配置OpenCV 参考 最近在做深度学习的C 部署相关工作 于是写下这篇文档记录环境配置的过程 环境配置是一项非常繁琐的工作 无论从大学做相关作业还是到工作上 做这项