【问题标题】:Xcode 7 and openCV (no Swift): Core.hpp header must be compiled as C++Xcode 7 和 openCV(无 Swift):Core.hpp 头文件必须编译为 C++
【发布时间】:2016-06-20 19:45:17
【问题描述】:

我已关注instructions,了解如何在 iOS 项目上安装 OpenCV。但是,当使用 Xcode 7 时,我必须手动添加前缀标头。不幸的是,这样做并没有帮助,我仍然遇到编译错误。然后我阅读了另一篇文章,建议最好手动添加导入,而不是在 Xcode 7 中使用前缀标头,所以我这样做了。

这是我的代码:

#import "ViewController.h"

#import <opencv2/opencv.hpp>
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <opencv2/highgui/cap_ios.h>
//using namespace cv;

@interface ViewController ()
{
    IBOutlet UIImageView* imageView;
    IBOutlet UIButton* button;
}

- (IBAction)actionStart:(id)sender;

@end

但是我仍然收到以下错误。

当我取消注释 using namespace cv;我得到以下信息:

我发现了一些复杂的解决方案,谈论将标头暴露给 Swift 等。我只想让我的项目在 Xcode 7 上使用 Objective-C ...

【问题讨论】:

  • 代码需要C++特性;您必须使用目标 C++,而不是目标 C。最快的“解决方法”是将您的 .m 文件重命名为 .mm;但这让你现在正在写 C++ 的事实变得更加糟糕。
  • 我试过了还是不行..
  • 你让它工作了吗? @mm24

标签: c++ ios objective-c xcode opencv


【解决方案1】:

OpenCV 是一个C++ 框架,这意味着任何使用OpenCV 的代码都必须使用C++ 解释来编译,而不是C 解释。

您看到的错误,例如带有using namespace cv; 的表示代码是使用objective-C 编译器编译的,而不是objective-C++ 编译器。

正如我在评论中提到的,实现这一点的最简单方法是确保#includes 的任何文件都必须命名为 opencv 标头,例如ViewController.mm,即它必须是一个Objective-C++文件。

或者,您可以选择并覆盖文件的Type,方法是在实用程序窗格中为文件类型明确选择Objective-C++ Source 选项。

【讨论】:

  • 感谢您的明确解释。我明天会试试这个,让你知道我是怎么过的......干杯,非常感谢你的回复:)
  • @mm24 你有没有解决过这个问题?我面临同样的问题,但似乎没有一个解决方案有效。 ://
  • 我不得不停止处理这个问题并寻找替代解决方案。我试过但不足以确认它是否有效。我接受,因为它有 4 个赞成票,而且听起来很合理。
【解决方案2】:

我刚刚遇到了完全相同的问题。我正在使用 OpenCV 进行 Swift 项目。

关于 Swift,它的 OpenCV 入口点是一个我称为 OpenCVWrapper 的文件。所以我得到了 OpenCVWrapper.h 和 OpenCVWrapper.mm。在我的项目的桥接头中,我得到了#import "OpenCVWrapper.h"。

问题是我想在 Objective-C++ 中编写一个名为 MatUtils 的类,我可以从 OpenCVWrapper.mm 调用它。为了让它们在那里可见,我必须将它们放在 MatUtils.h 中。

长话短说,错误在于在 OpenCVWrapper.h 中,我执行了 #import "MatUtils.h"。错误!!!!由于 OpenCVWrapper 位于桥接头中,因此现在可以从 Swift 访问 C++!

快速修复:#import "MatUtils.h" in OpenCVWrapper.mm!

干杯! bRo

【讨论】:

  • 刚刚遇到了类似的问题。几分钟后,我意识到我可以重新打开 .mm 中的接口并将实例属性放在其中,而不是主 wrapper.h 否则会使我陷入递归:-)
  • 是的!我想你在关注这个 medium.com/compileswift/ios-opencv-and-swift-1ee3e3a5735b 并不清楚,谢谢。
  • 你好,我确实在关注那篇文章,因为我是写这篇文章的人哈哈。我必须更新那篇文章,有些东西已经过时了:)
  • @bRo,你最后更新了吗?我遇到了同样的问题,但我遵循了与您的文章和其他文章相同的步骤。
  • 还没有,我会尽快找到时间的,我保证:)
【解决方案3】:

解决方案与我们桥接 ObjectiveC 和 swift 的方法几乎相同,但我们在 Objective C 和 C++ 之间进行,因此我们将 C++ 代码放在一个扩展名为 (.mm) 的单独文件中,然后将其导入到您的 Objective C 文件中(.m)

例如,如果您有 ViewController.h 和 ViewController.m,则添加另外两个包含 C++ 代码的文件,将其命名为 OpenCV.mm 和 OpenCV.h,然后在导入任何内容之前将 OpenCV.h 导入 ViewController.m别的。 可能这张图片将有助于理解它:

在 Xcode 11.6 OpenCV Ver 3.4.3 上测试

【讨论】:

  • 谢谢。这张图片确实有助于理清问题。
【解决方案4】:

尝试将#import &lt; opencv2/opencv.hpp &gt; 放在#import "ViewController.h".Source 之前

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2018-06-06
    • 2015-01-05
    • 1970-01-01
    相关资源
    最近更新 更多