5

既存の非常に大規模なプロジェクトで、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経由でいくつかの可能性を見つけましたが、私の問題に一致するものを見つけることができませんでした.

この問題を見つける方法を知っている人はいますか?

4

1 に答える 1

1

Configuration.a(Builder.o): 関数内Builder::Create() const': Builder.cpp:123: undefined reference toFactory::Instance()'

が で定義されてFactory::Instance() いることを確認しFactory.o、明らかにアーカイブ ライブラリを使用しているため、ライブラリに含まれるものは のFactory.oのコマンド ラインにあり、その後にあるはずであると水晶球は言っています。 Configuration.a

コマンド ラインでのアーカイブ ライブラリの順序は重要です。

于 2013-03-22T03:45:25.443 に答える