MAC 下 OpenCV4 配置 VScode 失败 Xcode 成功记录(2021年12月)

2023-10-26

2022-1-22更新(VScode 设置成功)

详情请见:
https://blog.csdn.net/qq_42067550/article/details/122634801

问题描述

安装好了 OpenCV
但是在 VScode 里面花了3天时间尝试设置,最后以失败告终,转用 Xcode 后一切顺利,没有任何报错。。。。。

报错代码:

Undefined symbols for architecture x86_64:
  "__ZN2cv11namedWindowERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi", referenced from:
      _main in cckR1lBO.o
  "__ZN2cv6imreadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi", referenced from:
      _main in cckR1lBO.o
  "__ZN2cv6imshowERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_11_InputArrayE", referenced from:
      _main in cckR1lBO.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

网上查了很多,百度谷歌都试过了,没有找到一个有用的解决方案。
害得我以为是 OpenCV 安装出了问题,重装了 3 次,还把 VScode 也重装了好几次,无功而返。
从问题描述来看,一旦调用了 OpenCV 的函数,比如 imread,imshow 等就会出错,原因不明。
之前尝试过的方法罗列出来,避免遇到同样问题的人再踩坑:

  1. 在编译中添加 -std=c++11
  2. 使用 g++-11
  3. 设置 includePath 中的路径

安装 OpenCV

方法一:Homebrew

安装 homebrew,使用国内源速度很快!

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

依赖环境:

首先是 xcode

sudo xcode-select --install

然后是 pkg-config 用于精简编译(不确定在 xcode 环境下是否需要这个,vscode是需要的)

brew install pkg-config

使用 homebrew 安装
这里命令中不需要 opencv4,只要 opencv 即可

brew install opencv

速度很快也很快,而且各个文件夹路径设置的也很合理,建议 MAC 系统下还是使用 brew 安装比较好!
然后配置环境变量,前面一长串不重要,重要的是你看最后的结尾要对得上,因为有的安装完后会有软链接,比如/usr/local/opt/opencv/4.5.4/bin 这种形式

export PATH="/usr/local/opt/opencv@4/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/opencv@4/lib"
export CPPFLAGS="-I/usr/local/opt/opencv@4/include"
export PKG_CONFIG_PATH="/usr/local/opt/opencv@4/lib/pkgconfig"

方法二:源代码编译安装

下载地址:OpenCV 源代码
使用下载源代码编译安装,这种方式最后得到的路径和 brew 安装是有区别的,在 IDE 中设置的时候需要根据情况看(反正我试了是不一样的,不知道别人如何)
下载后进行解压到任意目录。
比如我的目录/users/jack/opencv-4.5.4

cd /users/jack/opencv-4.5.4
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D OPENCV_GENERATE_PKGCONFIG=ON -D CMAKE_INSTALL_PREFIX=/usr/local ..
make # make -j2 可以加速
sudo make install

这里注意两点:
-DOPENCV_GENERATE_PKGCONFIG=ON 这个语句用于生成 opencv4.pc 文件,安装 opencv3的时候不需要,但是安装 opencv4 是必须的。
另外 最后的两个点别漏了 ..
编译的时间非常漫长,需要加快速度可以用:

make -j2

安装完成后配置环境变量

PKG_CONFIG_PATH="/users/jack/opencv-4.5.4/release/unix-install"

然后检查一下

pkg-config --libs --cflags opencv4

显示了一长串内容:
在这里插入图片描述
这些内容是存在于opencv4.pc中的配置。

测试

1. VScode

下载一张测试图片到 Downloads 文件夹,命名为 opencv.png
然后在 VScode 新建文件 test.cpp

#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
 
using namespace std;
using namespace cv;

Mat src, dst, src_gray;

char* window_name = (char*)"Demo";

/**
 * @主函数
 */
int main( int argc, char** argv )
{

    /// 读取一副图片
    src = imread(argv[1], 1 );

    /// 将图片转成灰度图片
    cvtColor(src, src_gray, COLOR_RGB2GRAY);
    namedWindow(window_name, WINDOW_AUTOSIZE);
    imshow(window_name, src_gray);

    while(true) {
        int c;
        c = waitKey(20);
        if (27 == (char) c) {
            break;
        }
    }
}
## 编译测试程序
g++-11 `pkg-config opencv4 --libs --cflags opencv4` ./test.cpp -o ./test.o
## 运行测试程序
./test.o ~/Downloads/opencv.png

不出意外的话应该是现实一个转成黑白的图片,但是不幸的是这里出现了本文开头提到的报错~~~。

不甘心的我还是继续进行了尝试
先为VScode安装一些插件

  1. C/C++
  2. C++ Intellisense
  3. C++ Clang Command Adapter

在根目录下创建一个.vocode文件夹,再创建三个文件。

.vscode/launch.json
.vscode/tasks.json
.vscode/c_cpp_properties.json
文件tasks.json如下:

{
    "tasks": [
        {
            "type": "shell",
            "label": "g++ build active file",
            "command": "/usr/local/bin/g++-11",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.o",
                "`pkg-config",
                "opencv4",
                "--libs",
                "--cflags",
                "opencv4`"
            ],
            "options": {
                "cwd": "/usr/local/bin"
            },
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "problemMatcher": []
        }
    ],
    "version": "2.0.0"
}

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",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}.o",
            "args": [
                "~/Downloads/opencv.png"
            ],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment":  [
                {"name": "PKG_CONFIG_PATH", "value": "/Users/jack/opencv-4.5.4/release/unix-install"},   // 这是opencv解压码后创建的release目录下的unix-install, 要保证该目录下下有opencv.pc文件
                {"name": "DYLD_LIBRARY_PATH", "value": "/usr/local/lib"}
            ],
            "externalConsole": true,         // 这个表示新开一个命令行窗口并运行程序。
            "MIMode": "lldb",
            "preLaunchTask": "g++ build active file"         // 这里内容要和`.vscode/tasks.json``tasks`->`label`字段一样!
        }
    ]
}

c_cpp_properties.json 文件

{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include",
                "${workspaceFolder}",
                "/usr/local/include/opencv4"
            ],
            "browse": {
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": "",
                "path": [
                    "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include",
                    "${workspaceFolder}",
                    "/usr/local/include/opencv4"
                ]
            },
            "intelliSenseMode": "macos-gcc-x64",
            "macFrameworkPath": [
                "/System/Library/Frameworks",
                "/Library/Frameworks"
            ],
            "compilerPath": "/usr/local/bin/g++-11",
            "cStandard": "c11",
            "cppStandard": "c++11"
        }
    ],
    "version": 4
}

运行 --》 启动调试
依然之前提到的错误,无解~~~

2. Xcode

这里设置就轻松多了
打开 Xcode
选择 Create a new Xcode project
在这里插入图片描述
选择 Command Line Tool,然后 Next
在这里插入图片描述

输入项目名称
在这里插入图片描述
创建项目文件夹,点击 Create
在这里插入图片描述
得到以下界面
在这里插入图片描述
在右边的工具栏点选 Build Settings
在这里插入图片描述
找到 S
然后要配置路径了
主要就是蓝色框的Header Search PathsLibrary Search Paths
这里需要在红色框处进行双击
在这里插入图片描述
点击下面的加号,就可以添加路径了
这里为Header Search Paths 添加 /usr/local/include/opencv4
Library Search Paths 添加 /usr/local/lib
(下面的 /usr/local/Cellar/gdk-pixbuf/2.42.6/lib 是后面自动被系统添加进去的,原因未知)
在这里插入图片描述
右键点击左侧的项目名,选择 New Group
在这里插入图片描述
输入名称 lib
右键点击lib,选择 Add Files to
在这里插入图片描述
然后直接用 shift+command+g 进行路径搜索 /usr/local/lib
(如果用 brew 安装的,位置估计应该是 /usr/local/opt/opencv@4/lib)可以查看下具体的文件位置然后进行填写
搜索出来后,全选所有文件点击 Add
下面多处一长串
在这里插入图片描述
把之前的测试代码复制到 main.cpp
然后点击Product —> Build
在这里插入图片描述
前往输出的可执行文件所在目录
/Users/jack/Library/Developer/Xcode/DerivedData/
进入所在项目文件夹
可以看到
输出的文件 Opencv_test
在这里插入图片描述
打开终端
输入可执行文件地址和测试图片地址

/Users/jack/Library/Developer/Xcode/DerivedData/Opencv_test-bauyfnqfpaknutbrtnmmaculhedy/Build/Products/Debug/Opencv_test /Users/jack/Downloads/opencv.png

执行结果
在这里插入图片描述
成功!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MAC 下 OpenCV4 配置 VScode 失败 Xcode 成功记录(2021年12月) 的相关文章

随机推荐

  • Ubuntu服务器下安装FastDFS及nginx配置访问等问题记录

    Ubuntu服务器下安装FastDFS及nginx配置访问 下载对应包 编译环境 包解压环境配置 配置nginx模块和安装nginx来进行访问该图片 下载对应包 下载方式一 直接使用 wget 下载 如果太慢 可以去github下载 然后上
  • 基于Matlab开发的动态机器人轨迹仿真

    基于Matlab开发的动态机器人轨迹仿真 近年来 机器人技术的发展已经进入了高速发展时期 控制与仿真技术作为机器人领域中至关重要的一环 也随之发展壮大 而在动态机器人轨迹仿真方面 Matlab作为一款具备强大数学计算能力的软件 在该领域中得
  • QT实现sqlite数据库连接池

    ifndef CONNECTIONPOOL H define CONNECTIONPOOL H FileName 数据库连接池 Function 获取连接时不需要了解连接的名字 支持多线程 保证获取到的连接一定是没有被其他线程正在使用 按需
  • MySQL 远程登录与其常用命令的介绍

    以下的文章主要介绍的是MySQL 远程登录与其常用命令的介绍 MySQL 远程登录与其常用命令之所以能在很短的时间内被人们广泛的应用 原因也是因为它们的独特功能 以下的文章就有对其相关内容的介绍 MySQL 远程登录及常用命令 第一招 My
  • Unbantu22.04使用DevStack一键部署OpenStack(使用nat静态IP)

    d 学习openstack的小白 第一步就遇到了大麻烦 下载并部署Openstack 传统的基于组件 一个个的安装配置更加麻烦 使用DevStack工具 一键部署可能是个不错的选择 But devstack部署期间总是会出现各种各样的错误
  • JavaScript面向对象

    JavaScript面向对象 面向过程 面向过程就是讲需求一步一步自己完全实现 如 一堆衣服 需要自己一件一件洗 面向对象 面向对象是把有共同特征的方法抽取为类 比如 一堆衣服 都需要洗 创建洗衣机类 女朋友类 让她洗 类的定义和使用 定义
  • 机器学习 day09(如何设置学习率α,特征工程,多项式回归)

    1 常见的错误的学习曲线图 上方两个 当关于迭代次数的学习曲线图 出现波浪型或向上递增型 表示梯度下降算法出错 该情况可由 学习率 过大 或代码有bug导致 2 常用的调试方法 选择一个非常非常小的学习率 来查看学习曲线是否还是有误 即在某
  • uni-app网络请求的封装

    uni app网络请求的封装 这几天没事干 就去小程序开发小团队里看看 顺便看了一下代码 在网络请求上发现了一些问题 差点没忍住破口大骂 最终想了想 他们之前没做过 都是第一次就算了 其实是安慰自己而已 网络请求都写在page里 每个请求都
  • 池化方法总结(Pooling)

    在卷积神经网络中 我们经常会碰到池化操作 而池化层往往在卷积层后面 通过池化来降低卷积层输出的特征向量 同时改善结果 不易出现过拟合 为什么可以通过降低维度呢 因为图像具有一种 静态性 的属性 这也就意味着在一个图像区域有用的特征极有可能在
  • JAVA-while循环语句

    while循环语句用法比for语句用起来简单 格式也对的简单 while 判断条件 循环体 public class WhileTest public static void main String args int i 1 while i
  • 将tensorpack的inference改为pytorch

    最近在跑一个OCR模型 模型是用Tensorpack写的 模型做inference的时候 显存 速度都不是很理想 改成pytorch后 显存占用 速度比之前好了很多 记录下改inference的过程遇到的一些坑 将pb文件转为pth文件 i
  • Python 垃圾回收机制

    众所周知 我们当代的计算机都是图灵机架构 图灵机架构的本质 就是一条无限长的纸带 对应着我们今天的存储器 在工程学的演化中 逐渐出现了寄存器 易失性存储器 内存 和永久性存储器 硬盘 等产品 其实 这本身来自一个矛盾 速度越快的存储器 单位
  • 【易售小程序项目】请求包创建+登录功能实现【基于若依管理系统开发】

    文章目录 说明 请求包创建 创建文件夹 请求工具 request js 登录功能实现 请求方法 页面 涉及知识点 错误提示 前端校验 设置 token 到客户端缓存中 路由跳转 如果已经登录过 访问登录页直接跳转到首页 同项目其他文章 说明
  • 服务器配置填坑 wget: unable to resolve host address解决方法,最终成功

    项目上线 手续要配置服务器 甲方机房在单位内 无法使用公司云服务器 于是配置坑来了 配环境下载包 ubutun 16显示如下错误 wget unable to resolve host address wget 无法解析主机地址 这就能看出
  • 51单片机智能蓝牙小车

    作为大一电子小趴菜 在和队友学习制作蓝牙小车过程中遇到了许多困难 本文既为大家避坑 也作为团队总结 这篇文章分为两部分 1 组装篇 2 代码篇 思维导图 组装篇 先准备好一块电源拓展板 用于为电机驱动模块和降压模块连接电源 小车底盘可淘宝定
  • element ui 表单验证触发方式:trigger: ‘change‘和trigger: ‘blur‘区别

    推荐阅读 Vue2 7正式发布 代号为 Naruto 火影忍者 原生支持 Composition API 终于可以在Vue2项目中使用Vue3的新特性了 真香 南北极之间的博客 CSDN博客今天 Vue 创始人尤雨溪刚刚正式发布了 Vue
  • HTML+CSS+JavaScript复习笔记持更(十)——CSS3常用属性之定位

    定位 定位主要是用来设定元素在页面上的位置的 其代码为 position 定位有三种定位方式 static 无特殊定位 按照dom排序 absolute 绝对定位 往前面找最近的 有定位属性的元素 以该元素的起点为起点 绝对定位 脱离文档流
  • JS中sort()方法原理及使用

    sort 方法用于对数组的元素进行排序 并返回数组 默认排序顺序是根据字符串UniCode码 因为排序是按照字符串UniCode码的顺序进行排序的 所以首先应该把数组元素都转化成字符串 如有必要 以便进行比较 语法 arrayObject
  • 计算机组成原理(1)-软件设计(二十二)

    程序设计语言 软件设计 二十一 https blog csdn net ke1ying article details 129344983 计算机组成原理在软件设计考试分值占比较高 主要会考 1 数据的表示 数据进制转化 日常生活中使用的都
  • MAC 下 OpenCV4 配置 VScode 失败 Xcode 成功记录(2021年12月)

    2022 1 22更新 VScode 设置成功 详情请见 https blog csdn net qq 42067550 article details 122634801 问题描述 安装好了 OpenCV 但是在 VScode 里面花了3