2011-01-17 11 views
14

W moim projekcie Biblioteki rdzeniowe są częścią plików C/C++, natomiast interfejs użytkownika musi być rozwijany w Objective C, Jestem w stanie aby uzyskać dostęp/wywoływać funkcje C++ z plików Objective C/.mm , ale do tej pory nie można cofnąć szczęścia, tzn. nie mogę wywoływać funkcji Celu C z plików C++, , gdy próbowałem dołączyć nagłówek systemu Nagłówek celu celu CMiksowanie Celów C, (* .m, * .mm & .c /.cpp) plików

#import <foundation/foundation.h> 

poruszania 1000+ błędu kompilacji

coś takiego

/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:180:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:180: error: expected unqualified-id before '@' token 


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:182:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:182: error: expected initializer before '*' token 


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183: error: 'NSString' was not declared in this scope 


/Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183:0 /Developer/SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSObjCRuntime.h:183: error: 'aSelectorName' was not declared in this scope 

jestem brakuje jakiegoś pre-kompilacji flagi itp .. może ktoś zasugerować mi, najlepszy możliwy sposób, aby zadzwonić/dostęp obiektywne klasy C, która jest dziedziczona z NSObject, bez modyfikowania dużo kodu C++, i wystarczy zadzwoń jedna funkcja

struktura Kod/Zamówienie obejmuje pliki nagłówkowe są

Some system header file 
Some Core Class Header file 

#import <foundation/foundation.h> 
+2

powinno być

+0

@Bavarious: chociaż prawdopodobnie będzie działało tak, ponieważ domyślnie HFS + nie jest rozróżniana wielkość liter. – JeremyP

+1

@JeremyP Yup, stąd _bould_ zamiast _must_. =) Jego kod złamie się podczas kompilacji w systemie plików z rozróżnianiem wielkości liter. –

Odpowiedz

44

Jeśli masz plik .cpp z C++ kod, który trzeba wykorzystać Objective-C, jak również, albo zmienić nazwę tego pliku .cpp do .mm lub przekazać -x objective-c++ do kompilatora.

+1

Jak możemy przekazać ten parametr do kompilatora? możemy to znaleźć w ustawieniach projektu? – AmineG

+0

@ Którą wersję Xcode używasz? –

+0

Używam głównie Xcode 3.2.5 – AmineG

4

Stwierdziłem, że niemożliwym jest użycie dowolnego obiektu C w plikach nagłówkowych C++.

Jednak można uwzględnić Objective-c w plikach implementacji.

(.mm lub można ustawić jak interpretować .cpp pliki z informacją pliku Wybierz INFO-> Ogólne. Filetype: Sourcecode.cpp.objcpp)

Używaj

cppClass.h :

class objcClass; 

objcClass* mMemberVariable; 

cppClass.mm:

#import "objcClass.h"; 

void cppFunction(){ 
    [objcClass message]; 
} 

w nagłówku pliku cpp.

Następnie dołącz nagłówek, który definiuje klasę w pliku .cpp lub .mm.

+0

Superb jego pracy, – Amitg2k12

+0

Możesz użyć Objective-C w pliku nagłówkowym C++, Pracuję nad projektem, który to robi. Implementacja jest ustawiona jako Objective-C++ w Utilities-> File Inspector, a kod obj-c w nagłówku jest opakowany w #if defined (__OBJC__) –

+0

Znalazłem, że nie możesz zadeklarować żadnych klas Objective-C w pliku nagłówkowym bez plik zawierający plik .mm. W moim przypadku, ponieważ mój kod musi być wieloplatformowy, zadeklarowałem klasy Objective-C jako '' 'void *' '' w nagłówku, a następnie rzutowałem je w pliku implementacji .mm. – Adamski

1

Jeśli używasz Qt, istnieje makro Q_FORWARD_DECLARE_OBJC_CLASS, które może być użyte do przekazania deklaracji klasy Objective-C.

Jako punkt odniesienia, tutaj jest wdrożenie:

#ifndef Q_FORWARD_DECLARE_OBJC_CLASS 
# ifdef __OBJC__ 
# define Q_FORWARD_DECLARE_OBJC_CLASS(classname) @class classname 
# else 
# define Q_FORWARD_DECLARE_OBJC_CLASS(classname) typedef struct objc_object classname 
# endif 
#endif 
0

użyłem techniki o nazwie rozszerzenie plików w zależności od języka programowania. Dodałem także "-x target-C++" do kompilatora, ale problem pozostał. Pomogła mi rada dla link, zwróć uwagę na parametr "typ pliku".

Powiązane problemy