シンボルをエクスポートしない静的ライブラリ オブジェクト ファイルを強制的に含める (GCC/iPhone)
-
12-09-2019 - |
質問
iPhone アプリケーションで使用する静的ライブラリを作成しています。これには、シンボルをエクスポートしないソース ファイルが多数含まれています。それらが行うことは、クラスの静的インスタンスをインスタンス化し、コンストラクター内でコードを実行して、別の場所にある中央マネージャー クラスにさまざまなものを登録することだけです。コードが標準の iPhone アプリケーションの一部としてビルドされている場合、これはすべて正常に動作しますが、静的ライブラリに分離されると、これらのファイルは最終的なアプリケーション バイナリに組み込まれないため、それらのファイルに含まれるプライベート クラス インスタンスのコンストラクターは、実行できないため、問題が発生します。静的ライブラリのビルドと最終的なアプリケーションのビルドの両方で、デッド ストリッピングなどを行うすべてのビルド オプションをオフにしました。
私は少し前に Metrowerks コンパイラーでこの問題に遭遇しましたが、その場合はコードが中間ライブラリなしで単一のアプリケーションに組み込まれている場合でも発生していました。解決策は非常に簡単でした。ただ使ってください __declspec(force_export)
プライベート クラス インスタンスではすべて問題ありません。
GCC/iPhone に相当するものはありますか?私は GCC 4.2 で Xcode 3.1.4 を使用しており、iPhone OS 3.1 をターゲットとしています。あるいは、明示的に参照されているかどうかに関係なく、静的ライブラリ内のすべてのオブジェクトファイルにリンクするようにアプリケーションに指示する方法はありますか?使用を確認しました ar
オブジェクト ファイルの完全なセットが静的ライブラリに組み込まれているということです。
前もって感謝します。
解決
あなたが探しているオプションは次のとおりだと思います -all_load
:
-all_load
Loads all members of static archive libraries. See man ld(1) for
more information.
他のヒント
-all_load
多くのライブラリやフレームワークをリンクすると、いくつかの問題が発生します (Mac OS X)。この場合、次を使用して特定のライブラリからすべてのシンボルを強制的にのみ使用する必要があります。 -force_load
:
g++ test.cpp -o test -force_load libtoload.a