2016-04-19 18 views
0

私が作成している動的iOSフレームワークにサードパーティライブラリをインポートしています。しかし、ライブラリーは、そのヘッダーの1つに、次のようにあります。私のサポートプラットフォームはiOS版であるため、避ける方法#ifdef __x86_64__

#ifdef __x86_64__ 
    #import <Cocoa/Cocoa.h> 
#else 
    #import <UIKit/UIKit.h> 
#endif 

これには、デバイス用にコンパイルすると、エラーCocoa/Cocoa.h file not foundで失敗し、問題が発生します。

私はgeneric iOS deviceに変更し、構築し、それは動作しますが、私は理由を理解していない場合。

私はNOにBuild Active Architecture Onlyを設定しようとしたが、それはまだ同じエラーを与えます。

これを64ビットiPhoneデバイス用にコンパイルするには何かできますか?何らかの理由で、図書館の作成者は、64ビットはOSXアプリケーションでなければならないと考えました。

+0

実際にデバイスで障害が発生しますか?またはシミュレータで実行していました – Fonix

+0

ライブラリは実際にユーザーインターフェイスコンポーネントを使用していますか? '#import" Foundation/Foundation.h "'をインポートしようとするとどうなりますか? – dreamlax

+0

サードパーティのライブラリなので編集できません。コンパイル時に失敗し、実行できません – dmoss18

答えて

1

あなたのMacのハードウェア上で実行されているシミュレータ上で動作しているため、実際には実際のデバイス用のアームアーキテクチャ用にコンパイルすると、x8664となり、arm64では動作しません。generic iOS device

それはしかしそのIFDEFの欠点のビットのように見えるん...

+0

私はそれを実行することはできません。コンパイルが失敗します。 – dmoss18

+0

@ dmoss18あなたのiPhoneまたはシミュレータで実行している場合?または両方とも – Fonix

+0

シミュレータ用にコンパイルすると失敗します。実際のiOSデバイスを保持して実行すると「generic iOS device」に設定しない限り、 – dmoss18

2

サードパーティのライブラリで条件文は意味をなさない:__x86_64は、ターゲットCPU、ターゲットのない対応するOSを指定します。これらのマクロは、各SDKのヘッダTargetConditionals.hに定義されて

#if TARGET_OS_IPHONE || TARGET_OS_SIMULATOR 
    #import <UIKit/UIKit.h> 
#else /* assuming Mac OS */ 
    #import <Cocoa/Cocoa.h> 
#endif 

:[イオスwatchOS、tvOS]およびおそらくシミュレータのための対のMac OSの条件コンパイルするために

。これらのマクロは常に1または0に定義されており、いずれかに設定されていることを

TARGET_OS_* 
These conditionals specify in which Operating System the generated code will 
run. Indention is used to show which conditionals are evolutionary subclasses. 

The MAC/WIN32/UNIX conditionals are mutually exclusive. 
The IOS/TV/WATCH conditionals are mutually exclusive. 


    TARGET_OS_WIN32   - Generated code will run under 32-bit Windows 
    TARGET_OS_UNIX   - Generated code will run under some Unix (not OSX) 
    TARGET_OS_MAC    - Generated code will run under Mac OS X variant 
     TARGET_OS_IPHONE   - Generated code for firmware, devices, or simulator 
      TARGET_OS_IOS    - Generated code will run under iOS 
      TARGET_OS_TV    - Generated code will run under Apple TV OS 
      TARGET_OS_WATCH   - Generated code will run under Apple Watch OS 
     TARGET_OS_SIMULATOR  - Generated code will run under a simulator 
     TARGET_OS_EMBEDDED  - Generated code for firmware 

注:ここでは、ヘッダの抜粋です。

MacOS、iOS、watchOS、tvOSビルドでは、TARGET_OS_MACが定義され、1に設定されています。

は一般的に、あなたは、マクロが値1に等しいかどうかをテストする必要がある - ちょうど彼らが定義されているかどうかテストする(例えば:#ifdef TARGET_OS_IOS)が正しくありません。

+2

良い答えですが、おそらく '#if TARGET_OS_IPHONE ||代わりにTARGET_OS_SIMULATOR 'を使用します。 – trojanfoe

+0

@trojanfoeもちろん! ;)それを修正します。ありがとう! – CouchDeveloper

+1

__x86_64は、64ビットデバイス用にiOSシミュレータを使用する場合に定義されます。また、MacOS Xの32ビット版ではUIKitをインクルードしようとすると未定義になりますが、誰かが心配することがあります:-) – gnasher729

関連する問題