2009-09-20 12 views
4

iPhoneアプリケーションで使用するためのスタティックライブラリを作成しています。シンボルをエクスポートしない数多くのソースファイルが含まれています。クラスの静的インスタンスをインスタンス化するだけで、コンストラクタでコードを実行し、さまざまなものを集中管理クラスに登録します。これは、コードが標準のiPhoneアプリケーションの一部として構築されている場合には問題ありませんが、静的ライブラリに分割されている場合、これらのファイルは最終アプリケーションバイナリにはなりません。したがって、これは問題を引き起こします。静的ライブラリビルドと最終的なアプリケーションビルドの両方で、デッドストリップなどのすべてのビルドオプションを無効にしました。シンボル(GCC/iPhone)をエクスポートしない静的ライブラリオブジェクトファイルを強制的に挿入する

Metrowerksコンパイラでこの問題が発生しましたが、そのインスタンスでは、コードが中間ライブラリなしで単一のアプリケーションに組み込まれていても発生していました。解決策はかなり簡単でした。プライベートクラスのインスタンスに__declspec(force_export)を使用するだけで、すべてがうまくいきます。

GCC/iPhoneに相当するものはありますか?私はGCC 4.2でXcode 3.1.4を使用し、iPhone OS 3.1をターゲットにしています。あるいは、明示的に参照されているかどうかにかかわらず、アプリケーションに静的ライブラリ内のすべてのオブジェクトファイルをリンクするように指示する方法がありますか? arを使用して、オブジェクトファイルの完全なセットがスタティックライブラリに入っていることを確認しました。

ありがとうございます。

答えて

5

私はあなたが探しているオプションが-all_loadだと思う:あなたは多くのライブラリおよび/またはフレームワーク(のMac OS X)をリンクするために起こる場合

-all_load 
     Loads all members of static archive libraries. See man ld(1) for 
     more information. 
+0

素晴らしい!それはまさに必要なものでした:-)。 –

3

-all_loadは、いくつかの問題があります。この場合は、特定のライブラリのすべてのシンボルのみを-force_loadに設定してください。

g++ test.cpp -o test -force_load libtoload.a 
+0

Hmmm ...いくつかのテストの後、 "force_load"が私のために働かないようです(Mac OS 10.6.2)。しかし、 "all_load"は最終的にフレームワークで正常に動作しました。 – gaspard

関連する問題