Xcode 7不用c ++框架构build项目
我不能用一个新版本的opencv 3.0.0框架来构build项目(版本2没有这个问题)。 Xcode 7不会将c ++源代码编译为c ++。
这是最简单的设置,不是build立:
- 从这里下载3.0.0框架http://netix.dl.sourceforge.net/project/opencvlibrary/opencv-ios/3.0.0/opencv2.framework.zip
- 用Swift语言创build最简单的ios项目。
- 将框架拖放到项目中。
- 创build
Objective-C++
源代码和头文件并将其添加到项目中。 - 创build桥接头。
这是设置:
- build立。
这是编译器所说的:
opencv2.framework/Headers/core/base.hpp:49:4: error: base.hpp header must be compiled as C++
这是为什么? 我有.mm
文件,它应该编译为Objective-C ++源代码。
openCV import语句在你的Objective-C头文件中,所以暴露给Swift。 它应该在从Swift隐藏的实现文件xxx.mm中。 如果你移动它,你会发现你的项目编译。
Swift可以桥接到Objective-C,但是如果你暴露C ++代码,它将会失败。 你的Objective-C类应该被认为是你的Swift项目和openCV的C ++接口之间的一个包装接口。 Objective-C可以同时使用。 从Swift中调用Objective-C方法,而这些方法又可以在xxx.mm实现中使用openCV函数。
这不是openCV2与openCV3的问题。
更新
Grigory指出,特定的OpenCV头是纯粹的Objective-C – 它是iOSvideo接口openCV,所以它应该工作。 而我的设置是不正确的,因为我的桥接头是空的。 添加#import "CVWrapper.h"
确实会破坏构build。
这个问题是由openCV头引起的。 cap_ios.h
不是纯粹的Objective-C:它导入一个C ++文件:
#include "opencv2/core.hpp"
该文件设置为在C ++编译不可用时抛出错误
#ifndef __cplusplus # error core.hpp header must be compiled as C++ #endif
由于您无法控制框架,因此无论如何我都会采用隐藏所有头文件的方法:不保证任何openCV头文件都不会被C ++屏蔽。 我假设你会想要一个更复杂的包装无论如何来访问Swift方面的openCV函数。
这是我在 其他地方 已经 详细阐述的方法,一个使用openCV和Swift的小样本项目 。
更新
在与Grigory讨论之后,他同意:
我做了一个包装,它的工作..似乎没有找出为什么使用opencv2工作,最好使用包装。
包装规则! 在某些情况下,这可能看起来有点矫枉过正,但通常会为您节省麻烦。 当Objective-C和C ++混合使用时,这已经是一个很好的build议,但是在与Swift进行交互时,这已经成为一种必需。