我已经关注了如何在iOS项目上安装OpenCV的instructions。但是,当使用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 ...
答案 0 :(得分:26)
OpenCV是一个C++
框架,这意味着任何使用OpenCV的代码都必须使用C++
解释进行编译,而不是C
解释。
您看到的错误,例如使用using namespace cv;
表示代码是使用objective-C编译器编译的,而不是使用objective-C ++编译器。
正如我在评论中提到的,实现此目的的最简单方法是确保#include
个opencv标头的任何文件必须被命名,例如ViewController.mm
,即它必须是Objective-C ++文件。
或者,您可以通过在实用程序窗格中明确选择文件类型的Type
选项来选择和覆盖文件的Objective-C++ Source
。
答案 1 :(得分:9)
我刚才遇到了同样的问题。我在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 ++!
快速修复:OpenCVWrapper.mm中的#import“MatUtils.h”!
干杯! BRO
答案 2 :(得分:1)
解决方案与将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上测试
答案 3 :(得分:0)
尝试将#import < opencv2/opencv.hpp >
放在#import "ViewController.h"
之前。Source