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

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 
#include 
#include 
#include 
#include 
 
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
MAC 下 OpenCV4 配置 VScode 失败 Xcode 成功记录(2021年12月)_第1张图片
选择 Command Line Tool,然后 Next
MAC 下 OpenCV4 配置 VScode 失败 Xcode 成功记录(2021年12月)_第2张图片

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

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

执行结果
MAC 下 OpenCV4 配置 VScode 失败 Xcode 成功记录(2021年12月)_第14张图片
成功!!!

你可能感兴趣的:(计算机视觉,xcode,macos,opencv)