找不到opencv.hpp文件vscode Mac M1



我一直在Vscode中尝试在我的M1芯片Mac上设置opencv,我使用了自制啤酒,并遵循了所有必要的步骤将其安装在我的Mac上。我创建了一个vscode项目,并将其包含在c_cpp_properties.json和task.json文件中。当我写一个简单的测试程序时,我用g++构建了这个程序,但构建失败并抛出了一个错误:

致命错误:找不到"opencv2/opencv.hpp"文件

我尝试了很多不同的方法来包括库,但#include<opencv2/opencv.hpp>在我的程序中,在构建程序之前没有。Intellisense为我提供了程序中的建议和一切。我浏览了关于堆栈溢出的几个现有问题,但没有一个对我有效的解决方案

我尝试了一系列不同的解决方案,这些解决方案是我在网上、论坛上和周围找到的,但似乎都不起作用以下是我的c_cpp_properties.json和task.json文件:Task.json:

"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-I",
"/Users/user/Desktop/OpenCV/opencv/include/opencv2",
"/usr/local/include/opencv4"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "compiler: /usr/bin/g++"
}
]
}

c_cpp_properties.json:

{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**",
"/Users/user/Desktop/OpenCV/opencv/include/opencv2",
"/usr/local/include/opencv4"
],
"defines": [],
"macFrameworkPath": [
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "macos-clang-arm64",
"configurationProvider": "ms-vscode.cmake-tools"
}
],
"version": 4
}

我的示例代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std; 

/////////////////  Images  //////////////////////
int main() {
string path = "/Users/brettmylek/Desktop/OpenCV/Img/TestImg.jpg";
Mat img = imread(path);
imshow("Image", img);
waitKey(0);
return 0;
}

它只是打开一个映像来测试安装是否成功,这样我就可以继续开发我的实际项目了。

我将从c_cpp_properties.json开始,更确切地说是includePath元素。此元素仅适用于IntelliSense。它没有任何其他用途。这应该可以回答IntelliSense工作的原因。

如果你看看tasks.json,有一件事引起了我的注意:

"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
-->        "-I",
-->        "/Users/user/Desktop/OpenCV/opencv/include/opencv2",
-->        "/usr/local/include/opencv4"
],

这很可能不会像你想象的那样奏效。你想要的是:

"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-I/Users/user/Desktop/OpenCV/opencv/include/opencv2",
"-I/usr/local/include/opencv4"
],

编辑:你可能必须链接到已构建的opencv库(上次我检查它不是一个只有头的库)

EDIT2:你也确定这个路径:/Users/user/Desktop/OpenCV/opencv/include/opencv2">

上次我检查Linux上没有/Users

第三版:我检查了他们的github。如果错误持续存在,则很可能是错误的包含路径,即不是

"-I/Users/user/Desktop/OpenCV/opencv/include/opencv2"

也许它应该是(基于他们的github)这个:

"-I/Users/user/Desktop/OpenCV/opencv/include"

我也遇到过类似的问题,只是解决了它。作为参考,我通过自制程序安装了OpenCV,以及VSCode扩展C/C++C/C++ Extension Pack(均由Microsoft编写)。我有一台Mac M1,以前一直在使用Xcode,所以可能已经安装了一些与编译器相关的东西。

无论如何,要检查OpenCV的安装路径,请尝试brew --prefix opencv,它应该会给出类似/opt/homebrew/opt/opencv的内容。

这个文件是自制软件Cellar的符号链接,所以如果你更改opencv的版本,这个文件引用将保持不变。(顺便说一句,您可以通过键入readlink -f $(brew --prefix opencv)来查看磁盘上的实际位置,您应该会得到类似/opt/homebrew/Cellar/opencv/4.7.0_1的内容)。

您需要引用的opencv2文件夹中包含头文件,它位于下面的两个目录中——对我来说,在撰写本文时,它位于/include/opencv4中。

一个关键的时刻是Visual Studio设置文件.vscode/c_cpp_properties.json文件完全由VSCode用于自动完成,所以我在其中添加了includePath/opt/homebrew/opt/opencv/include/opencv4

然后在tasks.json文件中,我必须添加到"args"部分:

"-I$(brew --prefix opencv)/include/opencv4",
"-L$(brew --prefix opencv)/lib",
"-lopencv_core",
"-lopencv_imgcodecs",
"-lopencv_highgui",

我确实从另一篇StackOverflow帖子中改编了这篇文章,所以感谢Jeffrey Yu。

只是为了解释一下,$(brew --prefix opencv)在运行编译器的命令行中运行一个迷你脚本,因此您最终获得了brew文件夹的完整路径。

所以我的tasks.json文件看起来像这样:

{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ build active file",
"command": "/usr/bin/clang++",
"args": [
"-std=c++17",
"-fcolor-diagnostics",
"-fansi-escape-codes",
"-I$(brew --prefix opencv)/include/opencv4",
"-L$(brew --prefix opencv)/lib",
"-lopencv_core",
"-lopencv_imgcodecs",
"-lopencv_highgui",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}

我的c_cpp_properties.json看起来是这样的:

{
"configurations": [
{
"name": "Mac",
"includePath": [
"${workspaceFolder}/**",
"/opt/homebrew/opt/opencv/include/opencv4"
],
"defines": [],
"macFrameworkPath": [
"/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks"
],
"compilerPath": "/usr/bin/clang",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "macos-clang-arm64"
}
],
"version": 4
}

作为参考,我的测试程序如下:

// opencv-test.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
using std::cout;
using std::endl;
using namespace cv;
int main(int argc, char** argv) {
Mat image = imread("my-image.jpg", IMREAD_UNCHANGED);
if (image.empty()) {
cout << "Not a valid image file" << endl;
return -1;
}
namedWindow("Simple Demo", WINDOW_AUTOSIZE);
imshow("Simple Demo", image);
waitKey(0);
destroyAllWindows();
return 0;
}

作为一种包括所有可用的OpenCV库的更为防弹的方法,您可以添加:,而不是上面的tasks.json调整

"`pkg-config --cflags --libs opencv4`",

这是因为pkg-config --cflags --libs opencv4(在命令行中不带反勾号地尝试)会生成整个包所需的所有包含和链接信息。

相关内容

  • 没有找到相关文章

最新更新