【问题标题】:Xcode 7 does not build project with c++ frameworkXcode 7 不使用 c++ 框架构建项目
【发布时间】:2015-12-20 12:48:07
【问题描述】:

我无法用新版本的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++

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

【问题讨论】:

    标签: c++ ios xcode opencv opencv3.0


    【解决方案1】:

    openCV 导入语句在您的 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 - 它是 openCV 的 iOS 视频接口,所以它应该可以工作。而且我的设置不正确,因为我的桥接头是空的。添加#import "CVWrapper.h" 确实会破坏构建。

    该问题是由该 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 函数。

    这是我haveelaboratedelsewhere的方法,带有small sample project using openCV and Swift

    更新

    在与 Grigory 讨论后,他同意:

    我已经制作了一个包装器,它可以工作。似乎与其找出使用 opencv2 构建的原因,不如使用包装器。

    包装规则!在某些情况下,这似乎有点矫枉过正,但通常可以为您省去麻烦。这在混合 Objective-C 和 C++ 时已经是很好的建议,但在与 Swift 交互时成为必需品。

    【讨论】:

    • 没有。 OpenCV 导入语句是将 OpenCV 的 Objective-C 部分导入到 xxx.h。你错了。我知道你在说什么,但事实并非如此。与 opencv 2 完全相同的设置工作正常,我有一个工作项目。
    • @Grigory 嗯...我不是故意光顾的。有时您必须猜测问题中的知识水平。事实上,刚才我正在将这个过度解释的答案与我认为太远的terse 进行比较。你对那个标题是objective-C是完全正确的,我没有检查过。在任何情况下,我都遵循了您的确切设置并且看不到问题。我的版本编译正确。
    • 你有什么版本的 Xcode?我用 7.0 (7A220) 版检查它
    • 相同 - 版本 7.0 (7A220)
    • 您是否可以存档您的项目(使用框架)并将其放在文件交换的某个位置,以便我可以在我的机器上打开它?从昨天开始,我一直在尝试解决这个问题,并且完全厌倦了它..
    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2017-09-16
    • 2017-10-08
    相关资源
    最近更新 更多