Xcode 7不用c ++框架构build项目

我不能用一个新版本的opencv 3.0.0框架来构build项目(版本2没有这个问题)。 Xcode 7不会将c ++源代码编译为c ++。

这是最简单的设置,不是build立:

  1. 从这里下载3.0.0框架http://netix.dl.sourceforge.net/project/opencvlibrary/opencv-ios/3.0.0/opencv2.framework.zip
  2. 用Swift语言创build最简单的ios项目。
  3. 将框架拖放到项目中。
  4. 创buildObjective-C++源代码和头文件并将其添加到项目中。
  5. 创build桥接头。

这是设置:

在这里输入图像说明 在这里输入图像说明

  1. 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进行交互时,这已经成为一种必需。