4

Objective-C++ で記述されたサードパーティ ライブラリにアクセスできるように、App Delegate ファイルを .m から .mm (Objective-C から Objective-C++) に変換しています。Objective-C では、アプリ デリゲートが正常にビルドおよび実行されます。しかし、拡張子を変更すると、プロジェクトがビルドされ、リンク エラーが発生します。これらはすべて、使用している C で記述されたスタティック ライブラリのシンボルが欠落しています。エラーは、次の形式の従来のリンク エラーです。

「MyFunction(arguments)」、以下から参照:

-MyAppDelegate.o の [MyAppDelegate myMethod]

シンボルが見つかりません

すべての問題はアプリ デリゲート オブジェクトにあります。ViewController ファイルが .mm であるため、Objective-C++ をコンパイルする準備が整っていることがわかります。だから私の質問にはいくつかの部分があります。

まず、これらのシンボルは、私が使用できないという意味で本当に存在しないのでしょうか? つまり、Objective-C++ ファイルから単純な古い C 関数にアクセスすることはできないのでしょうか? これが本当なら、かなり残念です。私は、ほぼすべての Objective-C コード、そして少なくとも .mm としてビルドされるすべての Objective-C コードが有効な Objective-C++ であると考えました。私が間違っている?

そうでない場合、これらのエラーを防ぐ方法はありますか? 私が知らない Objective-C++ で異なるヘッダー ルールはありますか?

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

4

2 に答える 2

8

C++/C または C++/Objective-C が混在するプログラムでのリンク エラーは、通常、C++ の名前マングリングが原因です。extern "C"すべての適切な宣言に添付されていること、およびすべてのコードがリンケージに同意していることを確認してください。つまり、関数定義とそれが使用されている場所がすべてextern "C"またはを参照できることを確認してくださいextern "C++"

MyFunction()特定の状況では、C++ リンケージでコンパイルされ、その名前がマングルされているように見えますが、 myMethodObjective-C ファイルはマングルされていない名前に対してリンクしようとしています。

これは、名前マングリングに関するウィキペディアの記事へのリンクです。

于 2010-08-10T18:37:37.073 に答える
3

ヘッダー インクルードを で囲みますextern C

これにより、ライブラリ内の関数名が C++ 名マングリングを取得しないことがリンカに通知されます。

例えば:

 extern "C" {
   #include "my-lib.h"
 }
于 2010-08-10T18:37:52.773 に答える