2016-03-07 11 views
11

Podążałem za instructions, jak zainstalować OpenCV na projekcie iOS. Jednak przy korzystaniu z Xcode 7 musiałem ręcznie dodać nagłówek prefiksu. Wykonanie tego niestety nie pomogło i wciąż otrzymywałem błędy kompilacji. Następnie czytałem kolejny post sugerujący, że najlepiej jest ręcznie dodać import i nie używać nagłówków prefiksu w Xcode 7, więc zrobiłem to.Xcode 7 i openCV (bez Swift): Nagłówek Core.hpp musi być skompilowany jako C++

Oto mój kod:

#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 

Jednak wciąż otrzymuję następujące błędy.

enter image description here enter image description here

Kiedy odkomentuj using namespace CV; Otrzymuję następujący:

enter image description here

znalazłem pewne kompleksowe rozwiązania mówić o wystawienie nagłówki Swift etc .. Chcę tylko mój projekt do pracy w Objective-C z Xcode 7 ...

+0

Kod wymaga funkcji C++; musisz użyć obiektywnego C++, a nie obiektywnego C. Najszybszym sposobem obejścia tego problemu jest zmiana nazwy pliku '.m' na' .mm'; ale to jest kopanie, że teraz piszesz 'C++' w tym momencie. – Petesh

+0

Próbowałem, ale nadal nie działa. – mm24

+0

Czy to dział[email protected] mm24 – Tam

Odpowiedz

18

OpenCV to framework C++, co oznacza, że ​​każdy kod wykorzystujący OpenCV musi być kompilowany z interpretacją C++, a nie interpretowany jako C.

Wyświetlane błędy, np. z using namespace cv; wskazują, że kod jest kompilowany przy użyciu kompilatora C, zamiast kompilatora C++.

Jak wspomniałem w swoim komentarzu, najłatwiejszym sposobem uzyskania tego jest upewnienie się, że każdy plik, który jest #include s, jest nazwany np. Opencv. ViewController.mm, tj. Musi to być plik Objective-C++.

Można również wybrać i przesłonić plik Type, wybierając opcję Objective-C++ Source dla typu pliku w panelu narzędzi. utilities pane drop-down selection

+0

dziękuję za jasne wyjaśnienie. Spróbuję tego jutro i dam ci znać, jak się dostałem .. Wiwaty i wielkie dzięki za odpowiedź :) – mm24

+0

@ mm24 czy kiedykolwiek obejrzałeś ten problem? Mam do czynienia z tym samym problemem i żadne z rozwiązań nie działa. :/ –

+0

Musiałem przestać nad tym pracować i znaleźć alternatywne rozwiązanie. Próbowałem, ale nie na tyle, aby potwierdzić, czy działa, czy nie. Akceptuję, ponieważ ma 4 głosy oddane i wydaje rozsądne dźwięki. – mm24

5

Po prostu miałem dokładnie ten sam problem. Pracuję w projekcie Swift z OpenCV.

Jeśli chodzi o Swift, jego punktem wyjścia do OpenCV jest plik, który nazwałem OpenCVWrapper. Więc mam OpenCVWrapper.h i OpenCVWrapper.mm. W nagłówku pomostowym mojego projektu otrzymałem #import "OpenCVWrapper.h".

Chodzi o to, że chciałem napisać klasę o nazwie MatUtils w Objective-C++, którą mógłbym wywołać z OpenCVWrapper.mm. Aby można je było zobaczyć, musiałem je umieścić w MatUtils.h.

Krótko mówiąc, błędem jest to, że w OpenCVWrapper.h zrobiłem #import "MatUtils.h". BŁĄD!!!! Ponieważ OpenCVWrapper znajduje się w nagłówku pomostowym, C++ jest teraz osiągalny z Swift!

Szybka naprawa: #import "MatUtils.h" w OpenCVWrapper.mm!

Pozdrawiam! bRo

+0

Wpadłem na podobny problem. Po kilku minutach zorientowałem się, że mogę ponownie otworzyć interfejs w .mm i umieścić właściwości instancji wewnątrz tego, zamiast głównego wrapper.h, który w przeciwnym razie wprawił mnie w rekursję :-) –

+0

Tak! Myślę, że podążałeś za tym https://medium.com/compileswift/ios-opencv-and-swift-1ee3e3a5735b, co nie było do końca jasne, dzięki. – rob5408

+1

Witam, rzeczywiście podążałem za tym artykułem, ponieważ to ja go napisałem haha. Muszę zaktualizować ten artykuł, niektóre rzeczy są nieaktualne :) – bRo