檔案被多個中間檔案輸出目錄相同的工程包含

2021-06-15 02:00:59 字數 867 閱讀 4371

case:

兩個工程proj1和proj2,同時包含demo.cpp,其中proj1在工程配置裡預定義巨集macro_proj1,proj2在工程配置裡預定義巨集macro_proj2,兩個工程的中間檔案輸出目錄為同乙個,檔案demo.cpp內容如下:

#include int main()

然後編譯兩工程生成proj1.exe和proj2.exe,期望的結果是proj1.exe輸出output by proj1,proj2輸出output by proj2,但是……意外發生了:

會發現一定的概率下,兩個exe輸出的內容相同,至於是output by proj1還是output by proj2則比較隨機。

analysis:

在出問題的情況下,既然proj1.exe和proj2.exe輸出一致,那麼可以推測生成兩個exe的源中間檔案demo.obj是一樣的,明明在兩個工程裡根據巨集定義,預編譯過後的源**是不一樣的,怎麼會出現生成的obj檔案一樣的情況呢?聯想到編譯器的「懶惰」特性,推測出發生問題的情況如下:

假設首先編譯proj1,那麼預編譯過後,原始檔裡生效的應該是printf("output by proj1");這一行,生成demo.obj,然後鏈結生成proj1.exe;然後在編譯proj2時,編譯器會先對比demo.cpp和demo.obj的時間戳,發現demo.obj的修改時間比較新,那麼就不用重新編譯,就將之前生成的demo.obj直接用於鏈結生成了proj2.exe。

confirmation:

更改proj1與proj2兩個工程的中間檔案輸出目錄為兩個不同的目錄,問題不再發生。 

done!

編譯產生的中間檔案作用

pdb檔案除錯用,pdb記錄資料和除錯資訊 跟蹤原始碼,是一種除錯資料庫檔案,不需要放到伺服器上 一種 powerbuilder 動態庫,作為本地dll的乙個替代物。程式資料庫檔案,在建立工程時自動生成,其中存放程式的各種資訊,用來加快除錯過程的速度。記錄了程式有關的一些資料和除錯資訊。map檔案除...

rsync同步檔案,排除多個檔案 目錄

使用rsync ap exclude upload 只能排除upload檔案 目錄。如果要排除多個檔案 目錄,怎麼辦?那只能建乙個exclude.list,裡面填寫要排除的目錄 一行乙個檔案 目錄 然後rsync ap exclude from exclude.list 如 rsync ap exc...

CMAKE學習 編譯多個檔案 多個目錄

大型工程會有很多檔案,包括類的實現和定義,各種不同的模組交叉在一起,我們怎麼用cmake方便的編譯呢?例如有這麼乙個工程 我們現在想要編譯的話,如果只選擇了main.cpp,則會提示 未定義的引用 因為我們標頭檔案和實現分離,但我們只包含了標頭檔案,所以是一定找不到實現的。我們這時候就要把所有原始檔...