Xcode7 不使用c++框架构建项目
Xcode 7 does not build project with c++ framework
我无法使用新版本的opencv 3.0.0 框架构建项目(版本2 没有这个问题)。
Xcode 7 不将 c++ 源代码编译为 c++。
这是不构建的最简单的设置:
- 从这里下载 3.0.0 框架 http://netix.dl.sourceforge.net/project/opencvlibrary/opencv-ios/3.0.0/opencv2.framework.zip
- 使用 Swift 语言创建最简单的 ios 项目。
- Drag-and-drop 项目的框架。
- 创建
Objective-C++
源和 header 并将它们添加到项目中。
- 创建桥接 header。
设置如下:
- 建造。
这是编译器所说的:
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.
交互时成为必需的
我无法使用新版本的opencv 3.0.0 框架构建项目(版本2 没有这个问题)。 Xcode 7 不将 c++ 源代码编译为 c++。
这是不构建的最简单的设置:
- 从这里下载 3.0.0 框架 http://netix.dl.sourceforge.net/project/opencvlibrary/opencv-ios/3.0.0/opencv2.framework.zip
- 使用 Swift 语言创建最简单的 ios 项目。
- Drag-and-drop 项目的框架。
- 创建
Objective-C++
源和 header 并将它们添加到项目中。 - 创建桥接 header。
设置如下:
- 建造。
这是编译器所说的:
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.
交互时成为必需的