Xcode 7不使用c ++框架构建项目

Gri*_*ory 3 c++ xcode opencv ios opencv3.0

我无法使用新版本的opencv 3.0.0框架构建项目(版本2没有此问题).Xcode 7不会将c ++源代码编译为c ++.

这是最简单的设置:

  1. 从这里下载3.0.0框架http://netix.dl.sourceforge.net/project/opencvlibrary/opencv-ios/3.0.0/opencv2.framework.zip
  2. 使用Swift语言创建最简单的ios项目.
  3. 将框架拖放到项目中.
  4. 创建Objective-C++源和标头并将它们添加到项目中.
  5. 创建桥接标头.

这是设置:

在此输入图像描述 在此输入图像描述

  1. 建立.

以下是编译器所说的内容:

opencv2.framework/Headers/core/base.hpp:49:4: error: base.hpp header must be compiled as C++
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这是为什么?我有.mm文件,它应该编译为Objective-C++源代码.

fou*_*dry 6

openCV import语句位于Objective-C头文件中,因此暴露给Swift.它应该在实现文件xxx.mm中,这是从Swift隐藏的.如果你移动它,你会发现你的项目编译.

Swift可以桥接到Objective-C,但如果向它公开C++代码,它将失败.您的Objective-C类应该被视为Swift项目和openCV的C++接口之间的包装器接口.Objective-C可以同时使用.从Swift中调用Objective-C方法,然后这些方法可以在xxx.mm实现中使用openCV函数.

这不是openCV2与openCV3的问题.

更新

Grigory指出特定的OpenCV标头是纯Objective-C - 它是openCV的iOS视频接口,因此它应该可以工作.我的设置不正确,因为我的桥接标头是空的.添加 #import "CVWrapper.h"确实打破了构建.

该问题是由openCV标头引起的.cap_ios.h不是纯粹的Objective-C:它导入一个C++文件:

    #include "opencv2/core.hpp"
Run Code Online (Sandbox Code Playgroud)

如果C++编译不可用,则该文件被设置为抛出错误

#ifndef __cplusplus
    # error core.hpp header must be compiled as C++
#endif
Run Code Online (Sandbox Code Playgroud)

由于你无法控制框架,我无论如何都会采取隐藏我自己的包装器后面的所有标头的方法:不能保证任何openCV头文件都会被C++屏蔽.我假设你想要一个更复杂的包装器来从Swift端访问openCV函数.

这是我 其他地方详细阐述 的方法,使用openCV和Swift小样本项目.

更新

在与格里戈里进行一些讨论后,他同意:

我已经做了一个包装器,它的工作原理..似乎没有找到为什么使用opencv2工作,最好使用包装器.

包装规则!在某些情况下看起来有点矫枉过正,但它通常可以帮你省去麻烦.这在混合Objective-C和C++时已经是很好的建议,但在与Swift接口时成为必需.