2013-03-20 48 views
5

在一個已經存在且相當大的項目中,我啓用了gcc編譯器優化O1使用O1優化時C++鏈接器錯誤

沒有這個選項,一切都會建立,鏈接和運行良好。 啓用了該選項,主要可執行文件編譯和鏈接,但鏈接一個單元測試時出現鏈接錯誤。

在這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函數中獲得一個)

當我看着th Ë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()之一。我確實看到有關此功能更改地址的內容,但我不認爲這會成爲問題。

也通過谷歌我發現了幾種可能性,但我找不到匹配我的問題的東西。

沒有人有如何找到這個問題的想法?

+2

編譯器版本?你如何編譯它(makefile足夠短,可以發佈?)?你確定它是你改變的唯一東西嗎(例如,如果你退出'-O1',它是否會再次編譯)? – us2012 2013-03-20 16:58:15

+0

除了缺乏線程安全性和誤導性的命名外('Factory'實際上更像是一個單例),我沒有在你展示的代碼中看到任何令人反感的東西。如果'-O1'確實是你改變的唯一的東西,這應該工作得很好。除非makefile中有一個條件語句不能編譯'factory.cpp',或者在優化開啓時出現了這樣的情況,但這有點荒謬(幾乎可以排除!)。 – Damon 2013-03-20 17:03:42

回答

1

Configuration.a(Builder.o):在功能Builder::Create() const': Builder.cpp:123: undefined reference to廠::實例()」

由於您確認Factory::Instance()Factory.o定義,既然你都明顯使用存檔庫,我的水晶球說,無論庫中是否包含Factory.o都在命令行之前Configuration.a,而它應該是之後的它。

命令行上歸檔庫的順序matters