vscode 怎么 include opencv2?

2020-07-22 16:15:10 +08:00
 xiaoming1992

初学 cpp
我把 opencv 下载到了一个单独的目录下

cpp-libs
|--opencv
|--|--sources
|--|--build
|--|--|--bin
|--|--|--x64
|--|--|--include
|--|--|--|--opencv2
|--|--|--|--|--core
|--|--|--|--|--|--core.hpp 等文件 /目录

c_cpp_properties.json文件如下:

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "${default}",
                "C:/cpp-libs/opencv/build/include"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "compilerPath": "C:\\MinGW\\bin\\g++.exe",
            "cStandard": "c11",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "clang-x86"
        }
    ],
    "version": 4
}

我在.cpp文件中引入opencv2如下:

#include <opencv2/core/core.hpp>

为什么 include 这个路径(C:/cpp-libs/opencv/build/include)还不够, F5 调试时依然提示 fatal error: opencv2/core/core.hpp: No such file or directory, includePath 到底应该是什么?

ps: 没用 visual studio, 太大了

2707 次点击
所在节点    C++
7 条回复
nannanziyu
2020-07-23 11:45:32 +08:00
@xiaoming1992
c_cpp_properties.json 里的 inlucdePath 只用于 Code Intelligence
你要在 tasks.json 里用 -I 参数来对 build 命令行增加 Include Path
比如

"command": "g++",
"args": [
"${file}",
"-g",
"-std=c++17",
"-Wall",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-I",
"C:/cpp-libs/opencv/build/include",
]
xiaoming1992
2020-07-23 12:02:44 +08:00
@nannanziyu 谢谢,确实是这样,在`tasks.json`中添加参数后就可以编译了。
可是编译后又报`'recursive_mutex' in namespace 'std' does not name a type`错误,`stackoverflow`上有类似的问题[https://stackoverflow.com/questions/14191566/c-mutex-in-namespace-std-does-not-name-a-type]( https://stackoverflow.com/questions/14191566/c-mutex-in-namespace-std-does-not-name-a-type),当然 google 上有很多相关问题,但是大多都说是编译器的问题
昨天试了一下,把 google 到的回答中推荐的编译器几乎都试了一下,还是不行,实在是搞不来了,又把 vs2019 下回来了,实在是不想下这个,太大了,公司电脑又太捞,但是没办法,应该是我太捞了,搞不来,算了算了,不折腾了。再次感谢
nannanziyu
2020-07-23 14:05:23 +08:00
1. recursive_mutex 属于 posix thread,所以你的 gcc 要下载 posix thread 的
比如用 MinGW-64
https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/
下载这个页面中的 x86_64-posix-seh
2. opencv 也要下载对应的 build
https://github.com/huihut/OpenCV-MinGW-Build,不然可以编译,但无法 link
3. vs2019 很小,最小安装只要 800M 。大是因为你把 msvc 和 sdk 都装上了
nannanziyu
2020-07-23 14:13:47 +08:00


task.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "g++",
"args": [
"${file}",
"-g",
"-std=c++17",
"-Wall",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"-I",
"F:/Download/OpenCV-MinGW-Build-OpenCV-4.1.1-x64/include",
"-LF:/Download/OpenCV-MinGW-Build-OpenCV-4.1.1-x64/x64/mingw/lib",
"-llibopencv_core411",
"-llibopencv_imgcodecs411",
"-llibopencv_highgui411"
]
}
]
}

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": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build"
}
]
}
xiaoming1992
2020-07-23 16:01:09 +08:00
感谢感谢,那应该是我的 opencv 版本不对,因为是很久之前下的,写了一点图片处理相关的东西,当时用的 vs2019 跑的好好的,因为处理效果不好(程序太捞)就搁置了,然后又卸载了 vs,现在捡起来用 vscode 结果跑不起来了。。。

你说的那个 mingw-64 那个版本我应该(?)是下载过的,但是当时估计是 opencv 版本不对,仍然跑不起来,待会再试一试,再次感谢,现在愿意像你这么详细地给新人讲解这种基础问题的不多了
nannanziyu
2020-07-23 16:11:47 +08:00
@xiaoming1992
1. 不是的,opencv 版本不对,只会导致 link 失败,编译是会通过的
2. 你用的是 win32 thread 的 MinGW-64,所以会提示不存在 std::recursive_mutex

nannanziyu
2020-07-23 16:19:00 +08:00
@xiaoming1992

绿框的是 posix thread 的 MinGW,编译 opencv 成功
红框的是用 win32 thread 的 MinGW,报错 std::recursive_mutex 不存在

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/692221

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX