完全に「C」ファイルで構成される静的ライブラリ プロジェクトを iOS に移植しています。アプリケーションでライブラリを使用しようとすると、未定義のシンボルが大量に発生します。
問題は名前の装飾のようです。たとえば、次の関数があるとします。
unsigned int hello_world(int arg1, int arg2);
「nm」を使用して .a ファイルを確認すると、次のように表示されます。
関数が実装されている file1.c の場合:
0000002c T __Z10hello_worldii
関数を呼び出す file2.c の場合:
U __Z10hello_worldii
しかし、関数も呼び出し、シンボルが定義されていない file3.c の場合、次のようになります。
U _hello_world
3 つの.cファイルはすべてライブラリ プロジェクトにあります。プロトタイプは、file2.c と file3.c の両方に含まれるヘッダー ファイルにあります。__Z10とii C++ の名前の装飾ですか? もしそうなら、なぜこれらの C ファイルは C++ としてコンパイルされているのですか?
編集:
"Compile Sources As" 設定に関する Codo の質問により、"According to File Type" から "C" に変更してみることにしました。これにより、すべてのファイルが「C」としてコンパイルされ、関数名のマングリングの問題が解決されましたが、まだ42個の未定義シンボルがあり、ほとんどすべてが変数であることが判明しました。これらの変数の初期化子がないことに気付いたので、そのうちの 1 つに初期化子を追加し、ライブラリを使用するプロジェクトを再構築すると、未定義のシンボルが 3 つしかありませんでした。変数にイニシャライザを 1 つ追加するだけで、リンカがそのモジュール変数へのすべての参照を解決できるようになったようです。残りの 3 つの未定義シンボルは、さらに別の問題のようです。
EDIT2:
残りの 3 つのエラーのうち、1 つは別のモジュールからの初期化されていない変数であり、2 つは静的であると宣言する必要があるインライン関数でした。