我有一些單元測試失敗,由於一些數學計算返回意外的結果。make/gcc:「糟糕的構建」的可能原因是什麼?
- 代碼本身已知是正確的。
- 構建系統並沒有改變
- 編譯器標誌並沒有改變
我們使用的cmake生成的生成文件我們,這給了我一個高水平的信心,makefile文件是正確的。
該構建已經運行了很多個月,而這正是這種特殊的,不尋常的虛假故障,因此這個問題。
我查看了失敗測試的目標文件,並且正如所料,它比源文件更新,所以make認爲它不需要重新編譯它。
-rw------- 1 steve steve 64578 Feb 7 11:13 foo_tests.cc
-rw------- 1 steve steve 12930760 Feb 14 13:18 foo_tests.cc.o
如果我刪除對象文件並重建,測試現在通過。
-rw------- 1 steve steve 12931080 Feb 16 13:57 foo_tests.cc.o
我注意到新的目標文件稍大。這有點令人費解。
什麼會導致這樣的糟糕構建?
有什麼我可以做的,以檢測一個壞的構建之前,運行它,並發現虛假的錯誤?
構建細節:
這是使用cmake生成與生成文件釋放模式二進制,並使用在CentOS 7.2 GCC 5.2.1
我們使用的編譯器標誌構建的:
CXX_FLAGS
-Werror
-Wall
-Wextra
-m64
-msse2
-msse4.2
-mfpmath=sse
-ftemplate-depth-128
-Wno-unused-parameter
-Wno-maybe-uninitialized
-Wno-strict-aliasing
-pthread
-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
-ggdb2
-DNDEBUG
-O3
-funroll-loops
-fdevirtualize
-finline-functions
-fno-builtin-malloc
-fno-builtin-calloc
-fno-builtin-realloc
-fno-builtin-free
LINKER_FLAGS:
-m64
-rdynamic
_「有什麼事情可以在運行之前檢測到錯誤的構建並發現虛假錯誤?」_有些構建系統允許執行_dry runs_。 –
投票結束太寬泛。有太多的東西可能導致構建破壞。 –
'.cc'文件使用的某個頭文件可能已更改,但makefile並未列出頭文件作爲'.o'文件的先決條件。也許源文件上的時間戳被錯誤地重置爲某個較舊的值,或者'.o'文件上的時間戳被錯誤地更新而不重建它。沒有看到你的makefile和/或知道更多關於你的設置,這是不可能的。 – MadScientist