2013-03-20 11 views
5

すでに存在しているかなり大きなプロジェクトでは、gccコンパイラの最適化O1を有効にしています。O1最適化を使用するとC++リンカエラーが発生する

このオプションがないと、すべてがビルド、リンク、および正常に動作します。 オプションを有効にすると、メインの実行可能ファイルがコンパイルされ、リンクされますが、単体テストの1つをリンクするときにリンカーエラーが発生します。

これらの2つのコンパイルの実行の間に、コードを変更したりファイルを作成したりせずに、O1最適化フラグのみを使用しました。

私が手にエラーがある:

Configuration.a(Builder.o): In function `Builder::Create() const': 
Builder.cpp:123: undefined reference to `Factory::Instance()' 

どこリンク処理中に、この行に遭遇Builder.cppの(ライン123): CPPファイル

pObject = Factory::Instance()->CreateObject(); 

(リンカーエラーに加えInstance関数のうち、CreateObject関数からも1つを取得します)

E 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; } 

まず私がきれいにしようと、再構築し、それは何もしませんでした。 私はFactory.o(1つは最適化なしで1つ)の使用済みシンボルのダンプを作成するためにnmを使用し、これらを比較しました。

一部の記号は削除されていますが、Factory::Instance()は削除されていません。私はこの機能に関してアドレスが変更されたものを見ていますが、それが問題であるとは思わないでしょう。

また、私はいくつかの可能性を見つけましたが、私の問題に合ったものは見つかりませんでした。

誰でもこの問題を見つける方法のアイデアはありますか?

+2

コンパイラのバージョン?どのようにコンパイルするのですか?あなたが変更したのはそれが唯一のものであることを確認しましたか(つまり、 '-O1'を取り戻すと、再びコンパイルされますか?) – us2012

+0

スレッドセーフティや誤解を招くような名前付け(「Factory」は実際にはシングルトンのようなものです)が欠けていることを除けば、私が示したコードでは何も気にしません。'-O1'があなたが変更した唯一のものであれば、うまくいくはずです。 makefileに 'factory.cpp'や何かをコンパイルしない条件節がない限り、最適化がオンになっていますが、それはちょっとばかげているでしょう。 – Damon

答えて

1

Configuration.a(Builder.o):機能にBuilder::Create() const': Builder.cpp:123: undefined reference to工場::インスタンス()」

あなたはFactory::Instance()Factory.oで定義されたあり、そしてあなたが明らかにされているので、ことを確認しましたので、私のクリスタルボールは、Factory.oが含まれているライブラリは、の前にConfiguration.aの前にあり、の後はになるはずです。

コマンドラインmattersのアーカイブライブラリの順序。

関連する問題