2013-10-29 36 views
0

我定義了一個機械手:爲什麼這個操縱器不會與-O3連接?

inline std::ostream& my_manip(std::ostream& os); 

裏面我是用像這樣:

std::cout << my_manip << ...; 

所有這一切都彙編就好了兩個調試使用Boost.bjam和釋放模式。然而,當談到時間聯繫起來,我得到的只是釋放模式以下錯誤:

Undefined symbols for architecture x86_64: 
    "std::__1::basic_ostream<char, std::__1::char_traits<char> >::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >& (*)(std::__1::basic_ostream<char, std::__1::char_traits<char> >&))", referenced from: 
     my_routine in main.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

或者,更清晰:

Undefined symbols for architecture x86_64: 
    "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from: 
     my_routine in main.o 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

如果我註釋掉的機械手,一切編譯和鏈接就好了在調試和發佈模式下。

如果我離開操縱器,我可以通過用-O0重建項目來解決鏈接器錯誤,但是如果我的發佈模式是bjam默認(-O3),我更喜歡它。

我運行的Xcode 4.6.2及其相關的鏗鏘:

Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn) 
Target: x86_64-apple-darwin12.5.0 
Thread model: posix 

我如何得到這個機械手與優化正確鏈接?

+0

看來,很多人已經開始在更新到小牛後得到鏈接器錯誤......這是否是後發佈的幫助:http://stackoverflow.com/questions/19550436/how-mavericks-xcode5-0-1 -changed-the-compiler-and-linker – AndyG

+0

@AndyG:感謝您的鏈接,不幸的是它似乎不相關。與'-O0'編譯的源代碼鏈接不會產生錯誤,所以我能夠獲得* *鏈接。還有什麼我仍然運行10.8.5和Xcode 4.6.2。 – fbrereto

回答

1

刪除inline。我懷疑你是否在某個頭文件中聲明瞭操作符,並且只在一個翻譯單元中定義?使用inline您正在更改符號的可見性,這可能意味着編譯器生成了該函數,但它不會導出符號,以便其他翻譯單元可以看到它,即鏈接程序找不到它。

+0

如果我刪除內聯,則會出現重複的符號錯誤(我在多個翻譯單元中使用此操縱器)。使其成爲「靜態」似乎解決了此問題。謝謝! – fbrereto

+0

對不起,我太早關閉了這一個。刪除內聯並沒有解決問題,也沒有添加(或刪除)「靜態」限定符。我還將例程模板化爲'basic_ostream',鏈接器錯誤依然存在。 – fbrereto

+0

@fbrereto小心編輯你的問題,然後添加* real *代碼? –