18

私の Xcode プロジェクトは、2 つのターゲットを使用して同じ製品のバリエーションにビルドされます。2 つの違いは、含まれているライブラリのどのバージョンが使用されているかだけです。.c ソース ファイルの場合、ターゲット チェック ボックスを使用して、正しいバージョンを正しいターゲットに簡単に割り当てることができます。ただし、ヘッダー ファイルをインクルードすると、常に同じものがインクルードされます。これは 1 つのターゲットでは正しいですが、別のターゲットでは正しくありません。

各ターゲットに含まれるヘッダー ファイルを制御する方法はありますか?

これが私のプロジェクトファイル階層です(Xcodeで複製されています):

MyProject
  TheirOldLib
    theirLib.h
    theirLib.cpp
  TheirNewLib
    theirLib.h
    theirLib.cpp
myCode.cpp

そして myCode.cpp は次のようなことを行います:

#include "theirLib.h"
…
somecode()
{
#if OLDVERSION
  theirOldLibCall(…);
#else
  theirNewLibCall(…);
#endif
}

そしてもちろん、私は一方のターゲットを定義OLDVERSIONし、もう一方のターゲットを定義しません。

は示されているとおりでなければならないことに注意してください#include。次の両方がファイルが見つからないというエラーで失敗します。

#include "TheirOldLib/theirLib.h"
#include "TheirNewLib/theirLib.h"

theirLib.hターゲットごとにどれを含めるかをXcode に指示する方法はありますか?

制約:
- 2 つのヘッダー ファイルは同じ名前です。最後の手段として、そのうちの 1 つの名前を変更することもできますが、これは他のプラットフォームで大きな影響を与えるので避けたいと思います。
-#include囲んでいるフォルダーへの参照を追加するために を変更する必要があることも、条件付きコンパイル ディレクティブで 2 回行う必要があるため、むしろ避けたいことです。
- 私は自分のプロジェクトを自由に微調整できます。

助けてくれてありがとう。

4

5 に答える 5

23

答えの重要な部分は、コメントでクリスが提案したように USE_HEADERMAP = NO を使用することです。詳細はこちら。

短いレシピ (Xcode 3.2.2 で確認):

  1. 関連するターゲットごとに USE_HEADERMAP = NO のカスタム ビルド設定を追加します。方法は次のとおり
    です。 1.1。「ビルド」ペインでターゲットの情報パネルを開きます。
    1.2. ウィンドウの左下にあるアクション ポップアップ メニューをプルダウンし、[ユーザー定義設定の追加] を選択します。
    1.3。新しく追加された行で、最初の列 ("Setting") をUSE_HEADERMAPに、2 番目の列 ("Value") を に設定しNOます。

  2. 各ターゲットに正しいインクルード パスを追加します (ターゲット ビルド設定の「ヘッダー検索パス」)。私の例では、
    2.1. TheirOldLib「古い」ターゲット
    2.2に追加します。TheirNewLib「新しい」ターゲットに追加

ステップ 1では、Xcode の自動ヘッダー マップ機能を無効にします。これにより、プロジェクトに含まれるヘッダー ファイルは、実際のパスに関係なく、その名前から直接アクセスできます。2 つのヘッダーが同じ名前を持つ場合、この機能により解決できないあいまいさが生じます。

ステップ 2では#include "theirLib.h"、ヘッダー ファイルの実際のパス名を修飾しなくても機能します。

これらの 2 つの手順を組み合わせることで、私の 2 つの制約が満たされます。

最後に、私が知る限り、Apple によって文書化されてUSE_HEADERMAPません。グーグルで調べてみると、この設定は多くの場合非常に重要であるため、バグレポートに記入します。rdar://7840694 として報告されます。また、オープンレーダーでhttp://openradar.appspot.com/radar?id=253401として

于 2010-04-08T08:38:32.227 に答える
9

USE_HEADERMAP=NO一部のプロジェクトではやり過ぎです。を使用するだけで十分かもしれませんHEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT=NO

ドキュメントはこちら:
https://developer.apple.com/library/archive/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html

于 2011-09-07T12:43:43.973 に答える
-1

各ターゲットで異なるインクルード パスを使用できないのはなぜですか?

于 2010-04-08T00:12:55.107 に答える