これはすべて、開発ツールに完全に適用されます。 以前の投稿で、 Xcodeでヘッダーファイルを見つけるための非標準アルゴリズムについて書いた。 今日、私はいわゆるSDKについて詳しく説明します-Xcodeでは、この用語はiOSまたはMac OSの特定のバージョンのライブラリとヘッダーファイルのセットを指します。 xCodeを理解するためにSDKが必要なのはなぜですか?
- 各SDKは独自の個別のフォルダーにあり、他のSDKと簡単に共存できます。これにより、1台のコンピューターで異なるオペレーティングシステムの開発を行うことができます。 以前は、SDKは/ Developer / SDKにありました。 4番目のxCodeシリーズでは、xCode.app内に移動しました。
- OSの特定のバージョン用にプロジェクトを設定するのは簡単なことです。 プロジェクト設定でSDKを指定するだけで十分です。
技術的には、これは次のように実装されます。 Appleは、コンパイラに--sysrootスイッチを追加しました。 sysroot値は、ヘッダーファイルとライブラリを検索するためのパスにプレフィックスとして追加されます。 標準パス(例:/ usr / include)と-Iおよび-Lオプションで追加されたユーザーパスの両方が、この変更の影響を受けます。
次のように機能します。 Xcodeの設定でmacosx10.6 SDKが選択されているとします。 Xcodeは--sysroot = / Developer / SDKs / MacOSX10.6.sdkスイッチをコンパイラーに渡します。 その結果、/ usr / includeは/Developer/SDKs/MacOSX10.6.sdk/usr/includeに変わります。 ライブラリとフレームワークを見つけるためのパスでも同じことが起こります。 簡単に推測できるように、SDKにはusr / includeとusr / libがあり、対応するコンテンツが含まれています。
今度は、Xcodeの不可解な「追加SDK」オプションに進みます。
なぜこれが必要なのですか? あなたがミドルウェア企業であるとします。 ライブラリとフレームワークをXcode SDKとして設計します。 プロジェクトでミドルウェアを使用するには、Xcode設定の追加のSDKセクションでSDKへのフルパスを指定するだけです。 ヘッダーファイルとライブラリは自動的に使用可能になります。
ところで、多くの追加SDKを同時に使用できます。
残念ながら、よくあることですが、実装は美しいアイデアを台無しにしています。
追加のSDKをサポートするには、Xcodeで多くの追加作業を行う必要があります。これは、プロジェクトをビルドするときにブレーキがかかることで明らかになります。 使用するベースSDKと追加のSDKの組み合わせごとに、すべてのSDKのファイルの組み合わせツリーが一時フォルダーに作成され、このフォルダーへのパスが--sysrootに転送されます。 ファイルを正直にコピーする代わりに、シンボリックリンクが使用されますが、それでもプロセスは高速ではありません。
追加SDKを試してみたい人のために、githubでプロジェクトを準備しました。 SDKSettings.plistに注意してください。 このファイルは、XcodeがSDKを「認識する」ために必要です。
私のプロジェクトでは、追加SDKを使用せず、代わりにヘッダー、ライブラリ、およびフレームワークを検索するパスを手動で構成します。
ボーナス:SDKおよびOSバージョン
OSの次のバージョンごとに、新しいSDKがリリースされます。 ただし、これはmacosx10.8 SDKでコンパイルされたプロジェクトがMac OS X 10.8でのみ動作し、以前のOSでは起動しないという意味ではありません。
SDKバージョン10.8は、SDKにMac OS X 10.8 以前のシステムで使用可能なすべてのAPIが含まれることを意味します(廃止されたAPIを除く)。 プロジェクトがOS X 10.6で利用できない機能を使用しない場合、プロジェクトは10.6で問題なく動作します。
より興味深い状況は、利用可能な場合は新しい機能を使用し、古いシステムでは代替の実装を使用する場合です。 これには弱いリンクを使用します。 「弱リンク」は、動的ライブラリ全体または動的ライブラリとは別の関数のいずれかです。 開始時に弱リンクのライブラリを見つけることができない場合、プログラムは何も起こらなかったかのように実行を続け、リンカーは欠落している関数のアドレスとしてNULLを置換します。 もちろん、そこにない関数を呼び出すと、プログラムはクラッシュします。
したがって、呼び出す前に、関数のアドレスをNULLと比較し、関数が使用できない場合は、代替の実装を使用します。
サポートされているMac OSの最小バージョンは、プロジェクト設定(MACOSX_DEPLOYMENT_TARGET)で指定されています。 後のすべてのAPIは、弱いリンクのフラグが自動的に付けられます。 これは、/ usr / include / Availability.hで宣言されているマクロを使用して行われます。