2011-07-05 9 views
0

私の静的C++ライブラリには、コンストラクタを持つグローバルオブジェクトがいくつか含まれています。テストプログラムはAppleのgcc 4.2.1でビルドされ、実行時にオブジェクトがゼロで初期化されているのがわかりますが、コンストラクタは呼び出されません。静的なクラスメンバー変数についても同様です。Mac OS Xの静的C++ライブラリへのリンク:ライブラリのグローバルオブジェクトコンストラクタが呼び出されない

-force_loadオプションをldに指定することでこの問題を解決することは可能ですが、実行可能なサイズが大きいためにこの方法は良くありません。グローバルオブジェクトが定義されているファイルから関数を参照しようとしましたが、何の効果もありませんでした。

Linux(gcc 4.5.1)で同じコードをビルドする場合、そのような問題はありません。

+0

どうやって最終リンクを作成していますか?例えば。 'gcc'、' g ++ '、' ld'とは? –

+0

'g ++'を使用しています(したがって 'ld'が使用されます) – stkuzma

答えて

0

これは、バイナリをアーカイブ(.a)にリンクするとき、リンカはバイナリで未解決のシンボルのみをアーカイブから取得するためです。つまり、バイナリがアーカイブのグローバル(または静的)オブジェクトを参照していない場合、そのオブジェクトのシンボルとその初期化コードはリンクされません。

アーカイブや参照されていないグローバルオブジェクト。一般的な解決策は、何らかの形でバイナリからそのオブジェクトを参照することです(例えば、そのサイズを取る)。または、そのグローバルオブジェクトのコンストラクタが行うはずのことを行う初期化関数をライブラリに提供し、そのバイナリ呼び出しが機能するようにします。

+0

ありがとうございます。グローバルオブジェクトを参照しようとしました。成功しなかった。それはリンカのバグのようです... – stkuzma

+0

'static_cast (&global_object_in_archive)'のようなバイナリコードから参照する必要があります。これは間違いなくリンカーのバグではありません。 –

+0

もう一度同じ結果が得られます:) – stkuzma

関連する問題