一概述
什么是編譯器的一致性問題? 比如相同的代碼躲庄,在不同的時間或者機(jī)器編譯查剖,編譯選項不變,得到的二進(jìn)制是一致的噪窘,這個就是編譯器的一致性笋庄。
二 一致性影響條件
如果要保持編譯器編譯的一致性,如下幾點需要考慮:
1) 時間戳使用:DATE, TIME, TIMESTAMP 宏倔监,杜絕此類宏的使用編譯參數(shù)添加-Werror=date-time直砂,使用后編譯會報錯,如果依賴的第三方庫使用的話浩习,可以使用“-Wno-builtin-macro-redefined -D__DATE__= -D__TIME__= -D__TIMESTAMP__= ”使其失效静暂。
2) 絕對路徑的使用: FILE 宏,clang中這個宏往往跟編譯時clang指定的路徑有關(guān)谱秽,比如clang -c /absolute/path/to/my/file.cc
洽蛀,得到的是絕對路勁,如果要使用相對路徑的話疟赊,傳遞給clang的參數(shù)要使用絕對路徑郊供。
三 常見問題
在elf中有“.note.gnu.build-id”,如果代碼有變化的話“.note.gnu.build-id”字段的內(nèi)容肯定會變化。
下面這兩個宏使得依賴文件使用相對路徑
"-no-canonical-prefixes",
"-fno-canonical-system-headers",