C++ 在Mac OS X上作为框架安装OpenCV 3

C++ 在Mac OS X上作为框架安装OpenCV 3,c++,objective-c,macos,opencv,opencl,C++,Objective C,Macos,Opencv,Opencl,我想用OpenCV在OS X El Capitan上制作一个应用程序。我决定使用最新版本,2015年6月4日发布的3.0.0版。我使用brew安装了2.4.x版,但由于3版现在有一个用于osx构建框架的构建脚本,所以我希望使用该方法 从OpenCV.org下载版本3后,我在OpenCV-3.0.0目录中打开了一个终端窗口,并执行build_framework.py脚本,如下所示: 平台/osx/build_framework.py osx (osx参数告诉脚本创建一个名为osx的目录以在那里输出

我想用OpenCV在OS X El Capitan上制作一个应用程序。我决定使用最新版本,2015年6月4日发布的3.0.0版。我使用brew安装了2.4.x版,但由于3版现在有一个用于osx构建框架的构建脚本,所以我希望使用该方法

从OpenCV.org下载版本3后,我在OpenCV-3.0.0目录中打开了一个终端窗口,并执行build_framework.py脚本,如下所示: 平台/osx/build_framework.py osx (osx参数告诉脚本创建一个名为osx的目录以在那里输出框架)

一切都顺利完成,因此我随后将osx目录中构建的框架添加到我的项目中

令我大吃一惊的是,我的项目不会毫无错误地构建。首先是以下两个问题。以下是第一个示例的屏幕截图:

如果第一个问题没有出现,opencv2.framework中每个头文件的#ifndef u cplusplus#错误将被触发

发现问题是C++对象头需要在Objto-C头文件之前调用,所以我把下面的内容添加到项目中的PCH文件:

实际上,您可以将此代码添加到需要opencv.hpp头文件的头文件中,而不是为项目创建PCH文件。你也应该肯定地说“包含”和“不导入”,但它们都应该起作用

一旦我解决了这些问题,我仍然被架构x86_64的39个未定义符号所困扰

起初,我认为该框架不包括x86_64版本,但快速检查发现它同时包含了i386和x86_64版本的对象文件,并且我的项目设置都是正确的。 接下来,我查找了一些未定义符号的名称,发现它们是名为OpenCL的项目的一部分。OpenCL被认为可以加速一些功能,并包含在opencv3中。起初我以为模块没有生成,但在阅读build_framework.py构建脚本后,我发现它是从CMakeLists.txt文件中获取设置的。阅读本文显示以下OpenCL标志: 使用OPENCL 用openclamdft 使用_OPENCLAMDBLAS 正在设置

更多的阅读让我相信MacOSXElCapitan与OpenCL不兼容,因为它似乎需要内核支持。因此,我将CMakeLists.txt文件更改为不构建OpenCL,添加了“而不是APPLE” 使用OPENCL 用openclamdft 使用_OPENCLAMDBLAS

在对CMakeLists.txt文件进行更改并再次构建框架后,我的程序能够链接到opencv2.framework(不确定为什么他们仍然称它为opencv2而不是opencv3)并运行


这花费了我比我想承认的更多的时间,所以我想我会在这里分享我的经验,希望它能让其他人在使用他们的Mac OS X应用程序时免于OpenCV 3带来的所有挫折。干杯

将近两年后,我遇到了同样的问题。然而,我找到了一个更体面的解决办法

与您的想法相反,macOS实际上与OpenCL兼容,尽管它没有链接到OpenCV2.framework中。在我链接
opencv2.framework
之前,我尝试将我的二进制文件链接到
liblapack.tbd
libcblas.tbd
OpenCL.framework
,效果非常好

因此,只需转到项目设置->构建阶段->将二进制文件链接到库并添加以下内容: