2017-08-10 11 views
0

私は、C++コードにラッパー(Objective-C/C++で書かれた)として機能するフレームワークに入れたいC++プロジェクトを持っています。後でこれをSwiftまたはObjective-Cプロジェクトで、単にフレームワークをアプリケーションに追加するだけで使用できます。すべてのラッパー XcodeでC++プロジェクトのラッパーフレームワークを構築する

  • はビルドフェーズ
  • でラッパーの公開ヘッダが単にコピーするビルドフェーズで実行するスクリプトを追加しまし露出作成し

    • を:私がこれまで達成してきた何

      すべてのC++ヘッダー(ファイルディレクトリ構造を保持している)をフレームワークのディレクトリに格納して、フレームワークを使用してアプリケーションで使用できるようにします。私がこれを行うだけでなく、ビルド段階のヘッダーのフィールドに入れるのではない理由は、たくさんのファイルやフォルダがあり、それが現在どのように書かれているのではなく、すべてのヘッダーを#include "LocalHeader.h"に変更する必要があるからです#include "CppRootFolder/Subfolder/Header.h"となります。また、私はC++ファイルを変更せずに保存したいので、これをやっていません。

    問題:

    すべてが、実際のアプリケーションを構築する場合、Xcodeのは、それがファイル構造内のファイルを見つけることができないと言ってエラーになることを除いてうまく動作するようです。私が何を意味するか説明するために、私は次のようしている:

    • をフレームワークの傘ファイルはCppRootFolderで#include "CppRootFolder/umbrella.h"(C++傘ファイル)
    • /umbrella.h、私は
    • #include "CppRootFolder/Subfolder/Header.h"いくつかの各1を持っています各サブフォルダ内のヘッダのうち、C++コードのルートフォルダからそれらを参照する他のヘッダが含まれる。この上

    私のテイクは:

    問題は、コンパイラがC++コードのルートフォルダからヘッダを見つける必要があるということであると私には明らかと思われます。したがって、実際のAppでは、ビルド設定で、$ BUILT_PRODUCTS_DIR/FrameworkName.framework/Headersにヘッダー検索パスを追加します。これは、すべてのヘッダーをスクリプトでコピーした場所です。しかし、ビルドは失敗し、既に定義されている型を認識しないランダムなエラーが多数発生します。

    どのように私はこれを動作させることができますか?

    おかげ

    UPDATE(ログ):

    <module-includes>:1:9: note: in file included from <module-includes>:1: 
    #import "Headers/Box2D.h" 
         ^
    /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D.h:17:9: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D.h:17: 
    #import "World.h" 
         ^
    /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/World.h:10:9: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/World.h:10: 
    #import "Box2D/Box2D.h" 
         ^
    /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Box2D.h:34:10: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Box2D.h:34: 
    #include "Box2D/Common/b2Settings.h" 
         ^
    /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Common/b2Settings.h:153:8: error: must use 'struct' tag to refer to type 'b2Version' 
    extern b2Version b2_version; 
        ^
    <module-includes>:1:9: note: in file included from <module-includes>:1: 
    #import "Headers/Box2D.h" 
         ^
    /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D.h:17:9: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D.h:17: 
    #import "World.h" 
         ^
    /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/World.h:10:9: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/World.h:10: 
    #import "Box2D/Box2D.h" 
         ^
    /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Box2D.h:35:10: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Box2D.h:35: 
    #include "Box2D/Common/b2Draw.h" 
         ^
    /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Common/b2Draw.h:22:10: note: in file included from /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Common/b2Draw.h:22: 
    #include "Box2D/Common/b2Math.h" 
         ^
    /Users/luis/Library/Developer/Xcode/DerivedData/Project-dgathvjusrdgslfvqqcvkeqyjzcb/Build/Products/Debug-iphoneos/Box2D.framework/Headers/Box2D/Common/b2Math.h:28:31: error: unexpected type name 'int32': expected expression 
         int32 ix = *reinterpret_cast<int32*>(&x); 
    
  • +0

    macOSまたはiOS用のアプリを開発していますか? CPUアーキテクチャは同じではありません。ライブラリプロジェクトを作成しようとしましたか?あるいは、C++とObjective-C++のコードを同じアプリケーションプロジェクトに入れましたか? Objective-C++では、**。m **の代わりに**。** **というファイル拡張子がありますか? – JazzSoft

    +0

    ビルドに問題がある場合は常にコピー貼り付けエラーメッセージが表示されます。理由は2つあります。あなたの問題を理解することは簡単です(私たちはあなたの解釈に頼る必要はありません)。誰かが似たような問題を抱えていると、Googleに簡単になります。 –

    +0

    iOS用、これはiosアプリプロジェクトに追加されたCocoaタッチフレームワークプロジェクトで、C++とobj-C++コードが一緒にフレームワークプロジェクト内にあり、拡張子はobj-C++のため.mm – luis

    答えて

    0

    を使用すると、C++は外部からは見えてはならないラッパーを書きます。 したがって、#include "cppHedarFile.h"はラッパーの外部からアクセスできないようにしてください。そうしないと、Objective CコードでC++を使用する際にエラーが発生します。

    したがって、C++ヘッダー用の傘のヘッダーファイルはありません。

    技術的な詳細をご記入ください:表示されている貼り付けエラーメッセージをコピーしてください。エラーの解釈は誤解を招く可能性があります。


    あなたはこの行以外のすべてを貼り付けられませんでした:

    /Box2D.framework/Headers/Box2D/Common/b2Math.h:28:31: error: unexpected type name 'int32': expected expression 
        int32 ix = *reinterpret_cast<int32*>(&x); 
    

    は私に私が正しい後肢を与えます。 ほとんどの場合、Objective Cファイル*.mのC++ヘッダーが含まれています。 このようなファイルでは、C++の標準ヘッダーに到達できないため、タイプint32が認識されません。

    私は乞食で書いたようです。 Objective CラッパーをC++で作成する場合、パブリックヘッダーからのC++ヘッダーのインクルードは禁止されています。 *.mmによってのみ使用される内部ヘッダーからは、*.mmというファイルを作成できます。 このようにラッパーは仕事をしており、C++をラッパーのユーザーから渡しています。


    公開ヘッダKXSomeClass.h例:

    @interface KXSomeClass : NSObject 
    
    @property (nonatomic, readonly) BOOL allowed; 
    
    - (NSUInteger)someAction:(NSString *)s; 
    
    @end 
    

    プライベートヘッダKXSomeClass+Internal.h

    // this header is used only by wrappers 
    #import "KXSomeClass.h" 
    #include <memory> 
    @interface KXSomeClass() 
    
    - (instancetype)initWithNativeSomeClass:(const std::shared_ptr<SomeClass>&)nativeObject; 
    
    @end 
    

    実装KXSomeClass.mm

    #import "KXSomeClass+Internal.h" 
    
    @interface KXSomeClass() 
    @property (assign, nonatomic) std::shared_ptr<SomeClass> native; 
    @end 
    
    #import "KXSomeClass+Internal.h" 
    #include "cpp/SomeClass.h" 
    
    @implementation CSCapability 
    
    - (instancetype)initWithNativeSomeClass:(const std::shared_ptr<SomeClass>&)nativeObject 
    { 
        if (self = [super init]) { 
         _native = nativeObject; 
        } 
        return self; 
    } 
    
    - (NSUInteger)someAction:(NSString *)s 
    { 
        return _native->SomeAction(s.UTF8String); 
    } 
    
    - (BOOL)allowed 
    { 
        return _native->Allowed(); 
    } 
    
    @end 
    
    +0

    は投稿 – luis

    +0

    を更新しました申し訳ありませんが、私は正しく書いていないと思います。つまり、傘のヘッダーに.mmファイルにリンクされたヘッダーが含まれていて、このクラスにはC++オブジェクトがありますインターフェイス(ヘッダー)は、私は、C + +のオブジェクトを認識するために必要なC + +のヘッダーが含まれています。インタフェースのインスタンス変数宣言中に他にどのようにC++クラスを使用できますか? – luis

    +0

    すごい!もう1つの質問ですが、これらの余分なカテゴリとヘッダーをすべて追加するとパフォーマンスが低下しますか?これは、実際のパブリックヘッダで__cplusplusを使うこととどのように似ていますか? – luis

    関連する問題