2

Xcodeで、「Cocoaアプリケーション」プロジェクトを作成しました。その依存関係の1つは、C++コードを含むフレームワークです。AppDelegate.mの名前をAppDelegate.mmに変更し、フレームワークを含めました。

プロジェクトのコンパイルに失敗します。問題は、フレームワークのC++ヘッダーファイルがObjective-CまたはCocoaと競合するいくつかのシンボルを使用していることです。

  • C ++ヘッダーファイルは、verify()およびと呼ばれる関数を定義check()しています。これは、MacOSX10.8SDKの/usr/include/AssertMacros.hと競合します。
  • C ++ヘッダーファイルにはNO、Objective-Cマクロと競合すると呼ばれる変数が含まれていますNO

回避策は、これらの競合を回避するためにフレームワークのC++コードを変更することです。ただし、これは別の組織によって維持されている大規模なC ++プロジェクトであるため、これには時間がかかり、C++プロジェクトの将来の更新で中断する可能性があります。

これらのC++ヘッダーファイルをObjective-C++ではなくC++として扱うようにClang/Xcodeに指示する方法はありますか?

4

2 に答える 2

2

/usr/include/AssertMacros.hMac OS 10.8 に付属の を読むと、次のことができるようです。

#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0

を含める前にAssertMacros.h、と呼ばれるマクロを定義できなくverify()なりcheck()ます。

に関してNO:プリプロセッサを使用して、その変数の名前を変更できます。例えば:

#define NO NO_libraryname_renamed
#include <libraryname.hh>
#undef NO

ライブラリによる変数の使用方法によってNOは、問題が発生する可能性があります — ヘッダーが変数を として宣言している場合extern、Cocoa アプリは間違った名前で変数を参照し、未定義のシンボル エラーが発生します。ただし、その変数を使用しておらず、ライブラリがアプリに依存してその変数を定義していない限り、問題はありません。

(そして、問題のあるライブラリにバグ レポートを提出し、変数の名前を変更するように依頼してください。)

于 2013-01-25T18:51:32.163 に答える
-4

複数の言語を混在させることは、悲しみを呼び起こします。さらに、Objective C++ (それ自体が奇妙なハイブリッド) と C++ の混合。やらないでください。

于 2013-01-25T18:11:14.287 に答える