2016-10-25 5 views
0

私は、シミュレータ用にうまく構築するiOSプロジェクトを持っていますが、Generic Device用にビルドされたときや、Xcodeを通じて実際のデバイス上で実行しようとするとコンパイルエラーが発生します。注:実際のコンパイラエラー、リンカエラーまたは展開エラーではありません。エラーは、typedefの型が一致していない場合(つまり、別のSDKのヘッダーが含まれているか、異なるプリプロセッサ定義があるかのように)です。ターゲットデバイスを変更すると、どのコンパイラ設定が変更されますか?

私の質問は、Xcode UIでターゲットデバイスを変更したときにどのようなコンパイラ設定が変更され、どのような違いが表示されるのですか?プロジェクトの設定を見てターゲットデバイスを変更すると、差異は見えません。具体的には、展開ターゲットバージョンとSDKバージョンは変更されていません。

プロジェクトは、Xcode 7ではこれらのターゲットデバイスのいずれかを使用して正常にビルドされましたが、Xcode 8では使用できませんでした。これはXcodeに付属するSDKのバージョンに該当します。しかし、いくつかのターゲットデバイスで動作するためには、コンパイラの設定を変更する必要があります。私はそれが何をしているのかを見ることができれば、これは本当に簡単に修正するべきです!ここで

はコンパイルに失敗した(私のコードで)行です:

typedef  void*   IOSurfaceRef; 

そして、ここではエラーメッセージです:

error: typedef redefinition with different types ('void *' vs 'struct __IOSurface *') 

私は、エラーを修正助けを望んでいないに注意したりしてくださいそれが何をしようとしているかについてのアドバイス - 私はそれが良くないと知っていますターゲットデバイスを切り替えることによってどのコンパイラ設定が変更されるのかを知りたいだけです。

+0

エラーに関する実際の関連コードで質問を更新し、完全で正確な実際のエラーを投稿してください。 – rmaddy

+0

ありがとう、それは合理的な要求です。しかし、私はエラーを修正するための助けをしたくない - 私はコンパイラの設定がターゲットデバイスを変更することによって変更されていることを尋ねていると、コードが$ HIGHLY_QUESTIONABLE_THINGを行う理由についての質問に脱走するだろう... –

+0

それはあなたのtypedefまたはアップル/サードパーティのコードの中にありますか? – dan

答えて

1

CGBase.hは、このコードが含まれているので、それが失敗した:

#if !TARGET_IPHONE_SIMULATOR 

typedef struct CF_BRIDGED_TYPE(id) __IOSurface *IOSurfaceRef __attribute__((swift_name("IOSurfaceRef"))); 

#endif 

あなたのコードは、競合タイプのIOSurfaceRefための2つのtypedef秒を持っているので、あなたは、#if !TARGET_IPHONE_SIMULATORプリプロセッサディレクティブが真のデバイスのために構築しています。

+0

ありがとう。 Xcode 7に付属しているiOS SDKのCGBase.hには、IOSurfaceRefの宣言がないため、以前は動作していました。 –

+0

私の質問に対する答えは、「ターゲットデバイスを変更するときは、プリプロセッサーディレクティブ(TARGET_IPHONE_SIMULATORなど)が変更される」 –

関連する問題