Xcode7 不使用c++框架构建项目

Xcode 7 does not build project with c++ framework

我无法使用新版本的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. Drag-and-drop 项目的框架。
  4. 创建 Objective-C++ 源和 header 并将它们添加到项目中。
  5. 创建桥接 header。

设置如下:

  1. 建造。

这是编译器所说的:

opencv2.framework/Headers/core/base.hpp:49:4: error: base.hpp header must be compiled as C++

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

openCV 导入语句在您的 Objective-C header 文件中,因此暴露给 Swift。它应该在实现文件 xxx.mm 中,它对 Swift 是隐藏的。如果你移动它,你会发现你的项目编译。

Swift 可以桥接到 Objective-C,但如果您向它公开 C++ 代码,将会失败。你的 Objective-C class 应该被认为是你的 Swift 项目和 openCV 的 C++ 接口之间的包装器接口。 Objective-C 两者都可以。从 Swift 调用 Objective-C 方法,这些方法又可以在 xxx.mm 实现中使用 openCV 函数。

这不是 openCV2 与 openCV3 的问题。

更新

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

问题是由 openCV header 引起的。 cap_ios.h 不是纯 Objective-C:它导入了一个 C++ 文件:

    #include "opencv2/core.hpp"

该文件设置为在 C++ 编译不可用时抛出错误

#ifndef __cplusplus
    # error core.hpp header must be compiled as C++
#endif

因为你无法控制框架,我无论如何都会采取将所有 header 隐藏在我自己的包装器后面的方法:不能保证任何 openCV header 文件都会被屏蔽来自 C++。我假设您无论如何都需要一个更精细的包装器来从 Swift 端访问 openCV 函数。

这是我的做法have elaborated elsewhere, with a small sample project using openCV and Swift

更新

在与 Grigory 讨论后,他同意:

I've made a wrapper and it works.. Seems like instead of finding out why did build with opencv2 work it is better to use a wrapper.

包装规则!在某些情况下,这似乎有点矫枉过正,但通常会为您省去麻烦。这在混合使用 Objective-C 和 C++ 时已经是一个很好的建议,但在与 Swift.

交互时成为必需的