3

自動参照カウントを使用するコンパイラ プロジェクトを移植しています。しばらく前に Xcode でプロジェクトをセットアップしましたが、ARC を使用せずに Xcode 4.6 で引き続きビルドおよび実行できます。現在、その大部分を ARC に移植しましたが、Bison と Flex によって生成された Objective-C ファイルでは ARC を無効にする必要があることがわかりました。

(特定の理由はYYSTYPEid私のプロジェクトの ARC 以前のバージョンだったからです。私はそれを宣言することができ__unsafe_unretained id、それはコンパイルされますが、ARC でコンパイルされたコードは、私の古い非 - ARC コードは実行したため、実行時にクラッシュします。)

ただし、生成されたファイルの ARC を無効にする方法がわかりません。通常のプロセスでは、--fno_objc_arc[ビルド フェーズ] タブで特定の Objective-C ファイルにオプションを追加します。そのオプションを Flex と Bison のソース ファイルに追加しようとすると、Flex/Bison がオプションを認識できないため、ビルドが失敗します。

生成されたファイルは、変数が指す DerivedSources ディレクトリにありDERIVED_FILE_DIRます。ただし、それらは Xcode Project Navigator または Build Phases タブには表示されません。デバッグ ビルドとリリース ビルドではパスが異なるため、プロジェクトに追加できません。だから私はそれらに適用する方法がわかりません--fno_objc_arc

Xcode で Flex/Bison 派生ソースのファイルごとのビルド オプションを設定するためのヒントはありますか?

4

1 に答える 1

3

回避策を見つけました:

Bison/Flex ファイルを別の Xcode ターゲットに配置し、そのターゲットで ARC を無効にします。この「パーサー」ターゲットは、静的ライブラリを構築します。Flex および Bison で生成された Objective-C ファイルは、このターゲット内でコンパイルされます。次に、このターゲットをプロジェクトのメイン ターゲットの依存関係にして、メイン ターゲットがパーサー コードとリンクするようにします。

注意が必要なのは、Flex および Bison で生成されたヘッダーをメイン ターゲットからアクセスできるようにすることです。プロジェクトに追加されるのではなく、生成されるため、「公開ヘッダー」としてマークすることはできません。そのため、次のビルド設定をメイン ターゲットに追加する必要があります。

USER_HEADER_SEARCH_PATHS = $(CONFIGURATION_TEMP_DIR)/Parser.build/DerivedSources (「パーサー」は、Bison/Flex ファイルをビルドする静的ライブラリ ターゲットの名前です)

このソリューションは、ビルド設定でターゲットの名前をハードコーディングするため、かなり脆弱です。派生ソースで ARC を無効にする実際の解決策を誰かが持っている場合は、投稿してください。

于 2013-06-15T20:50:53.413 に答える