2011-10-31 56 views
4

根據這篇文章,Google C++測試框架認爲「make install」是一種不好的做法。'make install'被認爲是有害的嗎?

http://groups.google.com/group/googletestframework/browse_thread/thread/668eff1cebf5309d

這樣做的原因是,這個庫違反了「一個定義規則」。

http://en.wikipedia.org/wiki/One_Definition_Rule

某處在線程進一步,它說:「如果你通過不同-DGTEST_HAS_FOO = 1個標誌,以不同的翻譯單位,你會違反ODR或者有時候人們使用-D 選擇哪個malloc的。庫(debug vs release),並且你有 在整個電路板上使用相同的malloc庫。「

我的問題:

  1. 究竟是什麼這個項目是做錯了什麼?
  2. 我們能從中學到什麼?我們如何編寫更具防禦性的代碼來防止違反ODR?
+2

問題標題和第一行實際上有點混亂。 'make install'中沒有任何事情可以觸發ODR違規行爲,或者可以被認爲是*糟糕的做法*。如果不同的用戶試圖共享二進制文件並編譯具有不同編譯器標誌的不同位, –

+0

他們建議您應該將第三方庫(也可能是其他)集成到項目的構建系統中而不是使用「make install」。 –

回答

5

問題的直接答案是:不要編寫依賴於編譯器參數的代碼。在這種情況下,整個討論源於代碼根據編譯器標誌(很可能通過#ifdef或其他預處理器指令)而不同的事實。這又意味着儘管代碼庫是相同的,但通過更改編譯器標誌,處理後的代碼將會不同,並且使用一組標誌編譯的二進制代碼與使用不同標誌組編譯的二進制代碼不兼容。

根據實際項目,可能無法將代碼與編譯器標記分離,並且您將不得不忍受它,但我建議儘可能避免代碼可以從配置爲編譯器命令行,就像你應該避免使用帶有副作用的DEBUG代碼一樣。而當你不能,文件不同的編譯器標誌有影響。