私のプロジェクトでは、コアライブラリはC/C++ファイルの一部ですが、UIはObjective Cで開発する必要がありますが、Objective C /.mmファイルからC++関数にアクセス/呼び出すことはできますが、今のところうまくいきません。システムヘッダーでさえObjectiveCヘッダーを含めようとしたときに、C++ファイルからObjectiveC関数を呼び出すことができます
#import <foundation/foundation.h>
約1000以上のコンパイルエラーが発生し、
このようなもの
/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
コンパイル前のフラグなどが不足していますか?C++コードをあまり変更せずに、NSObjectから継承されたObjective Cクラスを呼び出し/アクセスするための最良の方法を誰かが提案できますか?1つの関数を呼び出すだけです
コード構造/ヘッダーファイルをインクルードする順序は
Some system header file
Some Core Class Header file
#import <foundation/foundation.h>
Objective-Cも使用する必要があるC++コードを含む.cppファイルがある場合は、その.cppファイルの名前を.mmに変更するか、-x objective-c++
をコンパイラーに渡します。
C++ヘッダーファイルでObjective-cを使用することは不可能であることがわかりました。
ただし、実装ファイルにObjective-cを含めることができます。
(.mmまたは、ファイルの情報で.cppファイルの解釈方法を設定できます。[情報]-> [一般:ファイルタイプ:ソースコード.cpp.objcpp]を選択します)
使用する
cppClass.h:
class objcClass;
objcClass* mMemberVariable;
cppClass.mm:
#import "objcClass.h";
void cppFunction(){
[objcClass message];
}
cppヘッダーファイル内。
次に、クラスを定義するヘッダーを.cppまたは.mmファイルに含めます。
Qtを使用する場合、Objective-Cクラスを前方宣言するために使用できるQ_FORWARD_DECLARE_OBJC_CLASS
マクロがあります。
参考までに、実装は次のとおりです。
#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
XCode 11では、ビルド設定Compile Source as(GCC_INPUT_FILETYPE)をObjective-C++(sourcecode.cpp.objcpp)に変更することで実行できます。これにより、ファイル拡張子の種類をmmに変更する必要がなくなります。
プログラミング言語に応じて、ファイルを展開するという名前の手法を使用しました。また、コンパイラに「-x Objective-c ++」を追加しましたが、問題は残りました。 link の評議会に助けられました、「ファイルタイプ」パラメータに注意してください。