0

私の問題は少し複雑です:

ライブラリ: CおよびC++で記述されたライブラリがあります。これは、AppleLLVMを使用してXCodeで完全にコンパイルされます。このライブラリ自体の作業はCコードによって実行されますが、私はC ++を好むため、C++部分は単なるC++インターフェイスです。理論的には、C++のみを使用して通信する必要があります。

アプリケーション: 上記のライブラリを使用するObjective-Cのアプリケーションがあります。当然のことながら、ライブラリとの通信はC ++を介して行われるため、「Objective-C ++」からライブラリを呼び出すには、.mmファイルが必要です。

コンパイル中に...「C」言語のいくつかの発行が発生します:

  • エラー:非定数静的データメンバーは行外で初期化する必要があります
  • エラー:ステートメント式はファイルスコープでは許可されていません
  • 等...

これはObjective-C++でのみ発生します

  • 目的-C++(アプリ)-> C ++ヘッダー(lib)-> Cヘッダー(lib、extern "C"付き)-> OK !!! なぜ?

ライブラリのテスト用に別のC++アプリケーションを作成すると、問題ありません。

  • C ++(アプリ)-> C ++(lib)-> Cヘッダー(lib、extern "C"付き)-> OK

詳細:ここでは常にAppleLLVMコンパイラを使用しています

質問: Objective-C++コードからC++からCコードをコンパイルするにはどうすればよいですか?通常のC++コードからコンパイルするのとはなぜ違うのですか?

4

2 に答える 2

2

することを忘れないでください

#ifdef __cplusplus
extern "C" {
#endif

<Some C method declaration>

#ifdef __cplusplus
}
#endif

Cメソッド宣言を含むヘッダーファイル内。

于 2012-07-04T03:04:53.047 に答える
0

長い試行とグーグルの後、私はついに理解することができました。Cヘッダーを呼び出す前に、MAXマクロとMINマクロの定義を解除する必要があります。何らかの理由で、それらは以前に定義されていました。コンパイラはエラーを正確に表示しません。だから大変でした。私が使用しているCフレームワークには、MAXマクロとMINマクロの独自の宣言があります...

他の人に役立つかもしれないもう1つの非常に興味深いことは、同じことを行う必要がある前に、独自のmaxとminを実装するCフレームワークを使用している場合はmaxとmin(小文字)を定義しないことです。

それは両方の問題を解決しました。

于 2012-07-04T02:58:51.827 に答える