既存の非常に大規模なプロジェクトで、gcc コンパイラの最適化を有効にしていO1
ます。
このオプションがないと、すべてが正常にビルド、リンク、および実行されます。オプションを有効にすると、メインの実行可能ファイルがコンパイルおよびリンクされますが、単体テストの 1 つをリンクするとリンカー エラーが発生します。
O1
これら 2 回のコンパイル実行の間に、最適化フラグのみを変更し、コードや make ファイルを変更しませんでした。
私が得るエラーは次のとおりです。
Configuration.a(Builder.o): In function `Builder::Create() const':
Builder.cpp:123: undefined reference to `Factory::Instance()'
リンク処理中のどこかで、次の行 (行 123) に遭遇しBuilder.cpp
ます: cpp ファイル
pObject = Factory::Instance()->CreateObject();
(関数のリンカエラー以外に、Instance
関数からも取得しCreateObject
ます)
を見ると、次のように表示されFactory
ます: ヘッダー ファイル
class Factory { public:
static Factory* Instance(); << rest of the file >>
そしてcppファイルで
Factory* Factory::sInstance = 0;
Factory* Factory::Instance() {
// Check if this is the first call
if (sInstance == 0)
{
// Create only instance
sInstance = new Factory();
}
// Address of the instance
return sInstance; }
最初に、クリーンアップと再構築を試みましたが、何もしませんでした。また、nm を使用して、使用されているシンボルFactory.o
(最適化のあるものとないもの) のダンプを作成し、これらを比較しました。
いくつかのシンボルが削除されていることがわかりますが、それは削除されていませんFactory::Instance()
。この関数に関して、アドレスが変更されたものを見たことはありますが、それが問題になることはないと思います。
また、Google経由でいくつかの可能性を見つけましたが、私の問題に一致するものを見つけることができませんでした.
この問題を見つける方法を知っている人はいますか?