一概述
什么是编译器的一致性问题? 比如相同的代码,在不同的时间或者机器编译,编译选项不变,得到的二进制是一致的,这个就是编译器的一致性。
二 一致性影响条件
如果要保持编译器编译的一致性,如下几点需要考虑:
1) 时间戳使用:DATE, TIME, TIMESTAMP 宏,杜绝此类宏的使用编译参数添加-Werror=date-time,使用后编译会报错,如果依赖的第三方库使用的话,可以使用“-Wno-builtin-macro-redefined -D__DATE__= -D__TIME__= -D__TIMESTAMP__= ”使其失效。
2) 绝对路径的使用: FILE 宏,clang中这个宏往往跟编译时clang指定的路径有关,比如clang -c /absolute/path/to/my/file.cc
,得到的是绝对路劲,如果要使用相对路径的话,传递给clang的参数要使用绝对路径。
三 常见问题
在elf中有“.note.gnu.build-id”,如果代码有变化的话“.note.gnu.build-id”字段的内容肯定会变化。
下面这两个宏使得依赖文件使用相对路径
"-no-canonical-prefixes",
"-fno-canonical-system-headers",
网友评论