Mac環境,安裝OpenCV,VScode斷點調試C++程序

背景

最近在研究圖像識別相關代碼——OpenCV,爲了便於調試,就要在Mac上搭建一個調試c++程序的調試環境。我這跑通了,分享給你們。php

clipboard.png

環境

  • Mac OS 10.14.5
  • xcode-select v2354
  • Visual Studio code 1.35.1
  • OpenCV 3.4.5
  • Clang 1001.0.46.4
  • CMake 3.14.5

步驟說明

  1. 編譯環境準備
  2. 安裝OpenCV
  3. 安裝VScode 插件
  4. VScode 項目配置
  5. OpenCV HelloWorld

clipboard.png

環境準備

Mac 自帶有C/C++環境,就再也不贅述。python

Xcode Command Line Tools是必須的,可經過一下命令行觸發安裝程序,或者下載安裝。ios

命令安裝 xcode-select
sudo xcode-select --install
下載 xcode-select 安裝

Apple Developer Downloadc++

clipboard.png

選擇下載文件注意這裏提示的版本號!
命令行安裝速度很慢,且失敗率很高,建議經過下載 dmg文件安裝

CMake 準備

clipboard.png

編譯OpenCV時要用到cmake。一樣能夠經過homebrew或者下載安裝。
下載方式安裝的CMake,cmake可執行程序在/Applications/CMake.app/Contents/bin/cmake.shell

若是你用的 homebrew方式安裝 opencv那麼CMake就不是必須的.

pkg-config 安裝

編譯引用有opencv庫的c/c++代碼須要附帶不少參數來告知include path,libs等,用pkg-config就能精簡編譯參數。json

brew install pkg-config

安裝OpenCV

有兩種方式安裝。segmentfault

brew install
## 一個命令安裝好opencv3
brew install opencv3

安裝好以後最好配置上這幾個環境變量。(通常命令行會提示你)xcode

export PATH="/usr/local/opt/opencv@3/bin:$PATH"

export LDFLAGS="-L/usr/local/opt/opencv@3/lib"
export CPPFLAGS="-I/usr/local/opt/opencv@3/include"

export PKG_CONFIG_PATH="/usr/local/opt/opencv@3/lib/pkgconfig"
用homebrew安裝很方便,就是安裝時間很長(我用了一個大白天)。額外還會安裝python-opencv。

編譯安裝

點擊下載源代碼。這裏我選擇的是Sources 3.4.5bash

解壓後,進入目錄app

cd <opencv 解壓後目錄>
mkdir release
cd release
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local 
make
sudo make install

這裏建立的release目錄會放cmake命令產生的成果。CMAKE_INSTALL_PREFIX配置的目錄會存make命令產生的成果。

到這裏若是都沒報錯就算安裝成功了。

通常都不會出問題,在虛擬環境不必定能成功。

參考自 編譯安裝opencv

寫個C++ Hello World

先寫一個只引用了標準庫的C++代碼試試看。

/// ./main.cpp
#include <stdio.h>
#include <iostream>

int main(int argc, const char * argv[]) {
    std::cout << "Hello, World!\n";
    return 0;
}

結果以下。
clipboard.png
沒問題就繼續嘗試在代碼引入OpenCV庫。

pkg-config 環境配置

安裝好後,配置一個環境變量就好了。

PKG_CONFIG_PATH="~/opencv解壓目錄/release/unix-install"

配置好以後在執行命令:

pkg-config opencv --libs --cflags opencv

顯示內容大體以下,這塊的內容就是opencv.pc裏面的配置。
clipboard.png

該環境變量就是爲了讓 pkg-config可以找到 opencv.pc這個文件。

寫個OpenCV Demo

好,重點來了,大部分人會卡在這裏

寫個OpenCV HellowWorld來試試,打開一個空的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 = "Demo";

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

    /// 讀取一副圖片,不改變圖片自己的顏色類型(該讀取方式爲DOS運行模式)
    src = imread(argv[1], 1 );

    /// 將圖片轉換成灰度圖片
    cvtColor(src, src_gray, CV_RGB2GRAY);

    namedWindow(window_name, CV_WINDOW_AUTOSIZE);

    imshow(window_name, src_gray);

    while(true) {
        int c;
        c = waitKey(20);
        if (27 == (char) c) {
            break;
        }
    }
}

進入到命令行環境

## 編譯測試程序
g++ `pkg-config opencv --libs --cflags opencv` ./test.cpp -o ./test.o
## 運行測試程序
./test.o ~/Downloads/opencv-logo.png
pkg-config 這條命令是爲編譯opencv測試代碼引入類庫。

能看到以下運行結果,恭喜你成功了。
clipboard.png

可參考該連接最後: 編譯自測程序

實際調試代碼不停編譯運行會敲不少命令,咱們嘗試把這些工做交給VScode。先爲VScode安裝一些插件

  • C/C++
  • C++ Intellisense
  • C++ Clang Command Adapter

在根目錄下建立一個.vocode文件夾,再建立三個文件。

  • .vscode/launch.json
  • .vscode/tasks.json
  • .vscode/c_cpp_properties.json

文件.vscode/tasks.json

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

文件.vscode/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-logo.png"
            ],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment":  [
                {"name": "PKG_CONFIG_PATH", "value": "opencv解壓目錄/release/unix-install"},   // 這是opencv解壓碼後建立的release目錄下的unix-install, 要保證該目錄下下有opencv.pc文件
                {"name": "DYLD_LIBRARY_PATH", "value": "/usr/local/opencv/build/lib"}   // 這個是你在編譯時,opencv make時`CMAKE_INSTALL_PREFIX`指定的目錄
                // {"DYLD_LIBRARY_PATH": "/usr/local/opencv/build/lib"}    // 這樣的配置是錯誤的!
            ],
            "externalConsole": true,         // 這個開關打開表示,新開一個命令行窗口並運行程序。
            "MIMode": "lldb",
            "preLaunchTask": "g++ build active file"         // 這一行的內容要和上一個文件`.vscode/tasks.json`的`tasks`->`label`字段的內容要如出一轍!
        }
    ]
}

文件.vscode/c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Mac",
            "includePath": [
                "/usr/local/include",
                "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include",
                "/usr/local/opencv/include",        // 這個是你在編譯時,opencv make時`CMAKE_INSTALL_PREFIX`指定的目錄
                "${workspaceFolder}"
            ],
            "browse": {
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": "",
                "path": [
                    "/usr/local/include",
                    "/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include",
                    "/usr/local/opencv/include",     // 這個是你在編譯時,opencv make時`CMAKE_INSTALL_PREFIX`指定的目錄
                    "${workspaceFolder}"
                ]
            },
            "intelliSenseMode": "clang-x64",
            "macFrameworkPath": [
                "/System/Library/Frameworks",
                "/Library/Frameworks"
            ],
            "compilerPath": "/usr/bin/g++",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

點擊VScode菜單欄Debug > Start Debugging運行結果以下:
clipboard.png

爲了便於調試,我把 launch.jsonexternalConsole設置爲 true,這樣會在 vscode以外新開一個終端運行程序,可能會彈框要受權,贊成便可。

常見問題

  1. pkg-config 配置不正確致使的報錯
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found
test.cpp:1:10: fatal error: 'opencv2/imgproc/imgproc.hpp' file not found
#include "opencv2/imgproc/imgproc.hpp"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
[Finished in 0.4s with exit code 1]

解決方案:

運行一下命令添加一條path

export PKG_CONFIG_PATH="/opencv解壓目錄/release/unix-install":"$PKG_CONFIG_PATH"
  1. dyld 包依賴問題
dyld: Library not loaded: @rpath/libopencv_dnn.3.4.dylib
  Referenced from: ~/App/test
  Reason: image not found
bash: line 1: 18912 Abort trap: 6           ~/App/test
[Finished in 1.0s with exit code 134]

解決方案:

if you want to solve error on terminal you can use export DYLD_LIBRARY_PATH=your/lib:$DYLD_LIBRARY_PATH if you want to solve error on Xcode in build page , go to "Runpath Search Paths" add you lib path

運行一下命令添加一條path

export DYLD_LIBRARY_PATH=/usr/include/opencv/build/lib:$DYLD_LIBRARY_PATH

遇到問題,歡迎留言

原文連接。不支持轉載!

相關文章
相關標籤/搜索