LKY 只有原創內容的 Blog

今之能者,謂能轉貼,至於魯蛇,皆能轉貼。不原創,何以別乎?

解決在 macOS 上安裝 OpenCV 遇到「‘opencv2/opencv.hpp’ file not found」地雷

Lin, Kao-Yuan's Avatar 2019-10-10

  1. 1. 檢查編譯設定
  2. 2. 透過 IntelliSense 驗證 includePath 正確性
  3. 3. 失敗:改 include
  4. 4. 成功解決:soft link

安裝 OpenCV 一直都是堪稱玄學的技術,猶記得我大四第一次入門花了兩週才安裝成功,其中一個原因是我自己對「編譯、連結、載入、執行」不熟悉,這也是我技能樹有待補強的地方。

是說,這麼多年過去了,Windows 和 Linux 上我也安裝了無數次,EmguCV 也搞得定,換到上 macOS 仍須鬼打牆一整天才找到解方。

錯誤如下:

fatal error: ‘opencv2/opencv.hpp’ file not found


檢查編譯設定

我又反覆檢查 VSCode 中 task.json 的編譯設定,確認給出的路徑裡的確有 libs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"version": "2.0.0",
"command": "clang++",
"args": [
"${file}",
//"main(regression_demo).cpp",
//"main(classification_demo).cpp",
"libLKYDeepNN/InputLayer.cpp","libLKYDeepNN/HiddenLayer.cpp","libLKYDeepNN/OutputLayer.cpp",
"-Wall",
//"-v",
"-pthread",
"-I /usr/local/Cellar/opencv/4.1.1_2/lib/",
"-lopencv_core",
"-lopencv_highgui",
"-lopencv_imgproc",
"-g",
"-std=c++11",
"-Ofast",
"-o",
"LKYDeepNN"]
}

透過 IntelliSense 驗證 includePath 正確性

而我在 c_cpp_properties.json 中給 IntelliSense 的 includePath 是這樣,

/usr/local/Cellar/opencv/4.1.1_2/include/opencv4/**

IntelliSense 能正確識別叫出 namespace cv 底下的東西,所以也驗證了是正確的。


失敗:改 include

如果我把 include 從這樣

1
#include <opencv2/opencv.hpp>

改成這樣

1
#include <opencv4/opencv2/opencv.hpp>

的話,「fatal error: ‘opencv2/opencv.hpp’ file not found」會消失,但是換成其他的更深層的 OpenCV hpp 找不到 include。

別忘了要改回來。


最後發現,在 /usr/local/inlcude 建立一個 softlink 指向 opencv2,就可以成功編譯。

1
ln -s /usr/local/include/opencv4/opencv2 opencv2

是解決了,但我依然說不清楚誰去參考了「/usr/local/include/opencv2」因此得到錯誤或正確的結果。

參考來源:https://blog.csdn.net/a13602955218/article/details/101625857

本文最后更新于 天前,文中所描述的信息可能已发生改变