在一個已經存在且相當大的項目中,我啓用了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()
之一。我確實看到有關此功能更改地址的內容,但我不認爲這會成爲問題。
也通過谷歌我發現了幾種可能性,但我找不到匹配我的問題的東西。
沒有人有如何找到這個問題的想法?
編譯器版本?你如何編譯它(makefile足夠短,可以發佈?)?你確定它是你改變的唯一東西嗎(例如,如果你退出'-O1',它是否會再次編譯)? – us2012 2013-03-20 16:58:15
除了缺乏線程安全性和誤導性的命名外('Factory'實際上更像是一個單例),我沒有在你展示的代碼中看到任何令人反感的東西。如果'-O1'確實是你改變的唯一的東西,這應該工作得很好。除非makefile中有一個條件語句不能編譯'factory.cpp',或者在優化開啓時出現了這樣的情況,但這有點荒謬(幾乎可以排除!)。 – Damon 2013-03-20 17:03:42