2016-03-07 3 views
11

Ich habe die instructions zur Installation von OpenCV auf einem iOS-Projekt verfolgt. Bei Verwendung von Xcode 7 musste ich manuell einen Präfix-Header hinzufügen. Das konnte leider nicht helfen und ich bekam immer noch Kompilierfehler. Ich lese dann einen anderen Beitrag, der vorschlägt, dass es am besten ist, die Importe manuell hinzuzufügen und Präfixüberschriften in Xcode 7 nicht zu verwenden, also tat ich.Xcode 7 und openCV (keine Swift): Core.hpp-Header muss als C++ kompiliert werden

Hier ist mein Code:

#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 

Jedoch habe ich die folgenden Fehler immer noch.

enter image description here enter image description here

Wenn ich die Verwendung von Namespace cv Kommentar-; Ich erhalte die folgende:

enter image description here

ich einige komplexe Lösungen gefunden sprechen über Header Swift auszusetzen etc .. Ich möchte nur mein Projekt 7 auf Objective-C mit Xcode arbeiten ...

+0

Der Code erfordert C++ - Funktionen; Sie müssen objektive C++, nicht objektive C verwenden. Der schnellste 'Workaround' ist das Umbenennen Ihrer '.m' Datei in' .mm'; aber das ist die Tatsache, dass Sie jetzt 'C++' die Straße hinunter an diesem Punkt schreiben. – Petesh

+0

Ich habe versucht, aber es wird immer noch nicht funktionieren .. – mm24

+0

Hast du das zur Arbeit [email protected] mm24 – Tam

Antwort

18

OpenCV ist ein C++ Framework, was bedeutet, dass jeder Code, der OpenCV verwendet, mit C++ Interpretation kompiliert werden muss, anstatt C Interpretation.

Die Fehler, die Sie sehen, z. mit der using namespace cv; zeigen an, dass der Code mit dem Ziel-C-Compiler und nicht mit dem Ziel-C++ - Compiler kompiliert wird.

Wie ich in meinem Kommentar erwähnt, ist der einfachste Weg, dies zu erreichen, sicherzustellen, dass jede Datei, die #include s ein opencv-Header ist, z. ViewController.mm, d.h. es muss eine Objective-C++ Datei sein.

Alternativ können Sie die Datei Type der Datei auswählen und außer Kraft setzen, indem Sie die Option Objective-C++ Source für den Dateityp im Bereich Dienstprogramme explizit auswählen. utilities pane drop-down selection

+0

danke für die klare Erklärung. Ich werde das morgen versuchen und Sie wissen lassen, wie ich mich verstanden habe. Prost, und vielen Dank für Ihre Antwort :) – mm24

+0

@ mm24 Haben Sie dieses Problem jemals gelöst? Ich stehe vor demselben Problem und keine der Lösungen scheint zu funktionieren. :/ –

+0

Ich musste aufhören, daran zu arbeiten und eine alternative Lösung finden. Ich habe versucht, aber nicht genug, um zu bestätigen, ob es funktioniert oder nicht. Ich akzeptiere, da es 4 Up-Stimmen hat und vernünftig klingt. – mm24

5

Ich hatte gerade das exakt gleiche Problem. Ich arbeite in einem Swift-Projekt mit OpenCV.

In Bezug auf Swift ist der Eingangspunkt zu OpenCV eine Datei, die ich OpenCVWrapper nannte. Also habe ich OpenCVWrapper.h und OpenCVWrapper.mm bekommen. Im Bridging-Header meines Projekts habe ich #import "OpenCVWrapper.h".

Ich möchte eine Klasse namens MatUtils in Objective-C++ schreiben, die ich von OpenCVWrapper.mm aufrufen konnte. Damit sie dort eingesehen werden können, musste ich sie in MatUtils.h legen.

Lange Rede kurzer Sinn, der Fehler ist, dass in OpenCVWrapper.h, habe ich #import "MatUtils.h". FEHLER!!!! Da OpenCVWrapper im Bridging-Header ist, ist C++ jetzt von Swift aus erreichbar!

Schnellkorrektur: #import "MatUtils.h" in OpenCVWrapper.mm!

Prost! bRo

+0

Gerade lief ein ähnliches Problem. Nach ein paar Minuten wurde mir klar, dass ich die Schnittstelle in der .mm wieder öffnen und die Instanzeigenschaften in diese einfügen konnte, anstatt die Haupt-wrapper.h, die mich sonst in eine Rekursion gebracht hätte :-) –

+0

Ja! Ich glaube, Sie folgten diesem https://medium.com/compileswift/ios-opencv-and-swift-1ee3e3a5735b, was nicht wirklich klar war, danke. – rob5408

+1

Hallo, in der Tat habe ich diesen Artikel verfolgt, weil ich derjenige bin, der es geschrieben hat, haha. Ich muss diesen Artikel aktualisieren, einige Dinge sind veraltet :) – bRo

Verwandte Themen