T____T~~~~~~~~~~ 仅记录我在Xcode里搭建OpenCV踩过的坑,这个过程特别曲折,本人从19/3/25到19/3/29足足花了五天才配置好这个环境orz。。。中间经历过无数次找死的操作,且听我慢慢讲来。
回顾:
本人开始搭建环境时使用的是 10.11 El Capitan版本的MacOS,但此时苹果的系统最新版已经到 10.14.4 Mojave。我先像以前使用Windows系统一样登陆官网https://opencv.org/releases.html下载Mac版本的安装包,解压后发现只有源码,根本没有动态链接库。然后我上网搜索了MacOS下带库文件的OpenCV的安装,查到用Homebrew安装的OpenCV就自带动态链接库。然后我照着流程安装了Homebrew(当时有一个提醒是我的操作系统版本过低,因为安装的是最新版Homebrew,可能在之后的使用中会出现一定的问题,我当时每当一回事儿,但后面我才发现这才是阻碍我配置环境的最大的阻碍。。。。。),然后使用brew install opencv命令安装,结果在安装opencv软件包依赖的库文件pcre时,发生了错误,系统提示该软件在make test的过程中出现了编译错误。因为想到了之前的提示,我想可能是因为这个最新版的pcre和我的操作系统不兼容,那不然我下载个较低版本的pcre包好了(这想法应该没错),然后我确实就去官网https://ftp.pcre.org/pub/pcre/ 下载了一个较低版本的pcre(我真是傻,因为后来我发现还有其他办法,我后面会提到,你们可以试试),根据PCRE的安装及使用这篇文章和/Users/‘your username‘/Library/Logs/Homebrew/pcre/03.make的参数设置重新编译安装了pcre软件包,然后重新执行brew install opencv命令,结果发现自己安装的pcre包Homebrew根本就识别不了,它会报错然后建议你reinstall pcre。然后我用尽了各种方法企图让Homebrew正确识别我安装的pcre,但由于一时心急,不小心使用错命令行把/usr/local/bin文件夹及其文件删除,后面花费3个小时使用 find / -name ‘your file name‘ 命令在系统中一个个查找原文件位置然后拷贝回/usr/local/bin文件夹然后使用时被告知 Error: Permission denied,然后使用搜索引擎发现一个解决方案:sudo chown $(whoami) /usr/local/bin (chown——更改文件或目录的所属用户),但是始终心里有点不舒服,但这个情绪暂时被搁置了。其实找回来后brew命令就可以使用了,但还是还是出同样的错误,就想是不是Homebrew在安装时有问题,不然卸载后重装好了,就运行了卸载命令,结果有文件没卸干净,就手动卸载一个粗暴地把原来/usr/local中的文件全删了,好家伙,在我重新安装homebrew的时候,就开始不停报错了,出现git: libpcre2.dylib are not loaded,我这才发现,我好像把不该删的删除了,然后我在网上单独下载了pcre2文件重新编译安装,然后又执行Homebrew Install,libpcre2.dylib好了,又显示另外一个依赖库没装,周而复始。。。。。。我这才发现,没法补救了,现在Homebrew都安装不了了,还安装个屁的opencv啊。。。然后我又把主意打到OpenCV的源码上,既然Homebrew安装不了OpenCV,那我只好自己去编译安装好了,这里我给一个地址 Mac下opencv的配置,有需要的同学可以参考着试试,里面教了如何自己编译安装OpenCV,但因为我自己当时心情已经崩溃了,根本不想再找教程,就直接粗暴地重装了系统(亲们重装系统记得备份文件哈),然后发现··········我去简直一切顺利呀。。。。。。。。。不过我不建议大家重装系统,这是下下下下下下下下下下下下策(因为备份需要时间,然后你以前安装的软件,现在又要重新配置了,如果又遇到什么问题了咩...........),而且我后面思考了一下,觉得还是可以有其它挽救的办法的,我后面会说的,大家可以参考着试试。
正文:
1、安装Homebrew
安装
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
卸载
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
命令可能改变,最好参照官网进行操作,官网地址:https://brew.sh/index_zh-tw.html
这个命令安装的是Homebrew的最新版, 可能会和你的当前OS版本不兼容,注意一下,这个在安装的时候会有提示,我建议Homebrew和os版本一定要匹配,不然后续可能出现问题,不过也可以先试试后面的步骤,不能成功安装OpenCV再返回第一步解决这个问题。
解决Homebrew与OS版本不兼容的问题
方法一(推荐):先正确卸载Homebrew,再将自己的操作系统升级到最新版,再重新安装Homebrew。PS: 一定要先卸载再升级,如果不重新安装Homebrew只升级系统,不兼容的问题还是没办法解决(我也不知道为什么),但是系统升级后用命令卸载Homebrew就卸不干净了,需要手动卸载一些文件,然后就会像我一样误删东西。。。。。哭??
方法二:老哥没办法了,重装系统吧。。要最新版本的,记得备份重要文件噢
2、安装OpenCV
brew install opencv
你会发现,当Homebrew和OS兼容后,这个步骤是多么地顺畅啊~~~~~~~不过这种命令(brew install + 目标包名)下载的都是最新版本的包,我当时下载的就是OpenCV4.0.1,如果你不想要OpenCV4怎么办?
这时候我们就要先了解brew的一些操作命令了 具体参考 Homebrew基本操作命令
里面有个 brew search 命令, 该命令能帮你搜索你所需要的包的可下载版本
brew search opencv
里面有3个版本可让你下载,其中我的电脑上下载了OpenCV2和OpenCV3,它会自动在你下载好的版本后面??
知道了对应版本的包名,就可以使用命令下载了
brew install opencv@3
同时,我在回顾里提过的我当时想下载一个较低版本的pcre包,就去官网下载了个版本自己编译,还识别不出来,其实根本就不用这么麻烦啊,直接brew查找啊
额。。。。。。我发现好像不对哎,pcre只有一个,pcre2不知道是不是pcre的升级,但是安装opencv依赖的是pcre包而不是pcre2。。。不管啦,跳过。。。
这个时候,你所需要的OpenCV指定版本就装好啦,可用 brew info 命令进行查看
3、在Xcode里配置OpenCV
找到工程文件的配置文件,在TARGETS——Build Settings中搜索Search Paths,在Header Search Paths中填入OpenCV3的头文件的所在路径,在Library Search Paths中填入OpenCV3的动态链接库的所在路径,我的是
/usr/local/Cellar/opencv@3/3.4.5/include 和 /usr/local/Cellar/opencv@3/3.4.5/lib
配置好运行,出现错误?
网上一查,发现一个解决方案:http://www.cnblogs.com/sparkmorry/p/3527624.html
赶紧试着解决一下,将编译器换掉,结果出现新的错误?
因为OpenCV的core文件依赖cstddef文件,所以只能使用LLVM C++ Standard Library with C++11 support这个编译器,这个编译器还没法改!!!!
那该怎么办??我想着既然原来的编译器识别不了OpenCV的库文件所在目录吧,那就用其它的方法把OpenCV的动态库链接进来。于是又在网上搜教程,找到一个解决方案:
在工程文件的配置文件找到TARGETS——Build Phases中找到 Link Binary With Libraries ,点击?号手动添加OpenCV的动态库,结果发现,这个路径搜索界面根本就到不了/usr/local的目录,那要怎么添加OpenCV的动态库呢?往下看吧,有解决方案。
我先将/usr/local/Cellar/opencv@3/3.4.5旗下的文件制作替身(就是源文件的链接),并将替身移动到添加动态库索引界面可以到达的位置,然后就可以凭上面的操作成功添加OpenCV的动态链接库啦~~~~~下面是添加成功的截图
4、运行程序
// // main.cpp // opencvTest // // Created by xxmeng on 2019/3/29. // Copyright © 2019 xxmeng. All rights reserved. // #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int main(int argc, const char * argv[]) { // insert code here... Mat image; image = imread( "/Users/xxmeng/Projects/CplusProjects/opencvTest/baby.jpg", cv::IMREAD_ANYCOLOR); if(!image.data ) { printf( "No image data \n" ); return -1; } namedWindow( "Display Image", WINDOW_AUTOSIZE ); imshow( "Display Image", image ); waitKey(); //return return 0; }
OK......总算成功了,撒花庆祝??????~~~~~~~以上,是我所有的经历。。若有帮助到需要的人,我会很开心让大家少走弯路哈哈
原文地址:https://www.cnblogs.com/dmzxxmeng/p/10630023.html