我有一些单元测试失败,由于一些数学计算返回意外的结果。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