C++编译过程
C++文件編譯過程主要為:
預處理->編譯->匯編->鏈接
1. 預處理
處理以#開頭的指令。
2. 編譯
將每個源碼.cpp文件編譯成.s匯編代碼,一個cpp文件編譯成一個.s文件。
3. 匯編
將匯編語句.s文件翻譯成機器指令.o文件,也就是一個.cpp文件對應一個.o文件。
4. 鏈接
匯編程序生成的目標文件,即.o文件,并不會立即生成exe文件,因為可能會出現.cpp文件中的函數引用了另一個文件中定義的符號或者調用了某個庫文件中的函數。鏈接的目的就是將這些.cpp文件對應的.o文件連接成一個整體,從而生成可執行的程序.exe文件。
鏈接分以下兩種方式:
- 靜態鏈接:代碼從靜態庫在鏈接階段直接拷貝到最終的可執行程序中,在該程序被執行時,這些代碼會被裝入到該進程的虛擬地址空間中。
- 動態鏈接:代碼被放到動態鏈接庫或共享對象的某個目標文件中,鏈接程序只是在最終的可執行程序中記錄了共享對象的名字等一些信息。在程序執行時,動態鏈接庫的全部內容會被映射到運行時相應進行的虛擬地址的空間。
兩者的優缺點為:
- 靜態鏈接:浪費空間,每個可執行程序都會有目標文件的一個副本,這樣如果目標文件進行了更新操作,就需要重新進行編譯鏈接生成可執行程序(更新困難);優點就是執行的時候運行速度快,因為可執行程序具備了程序運行的所有內容。
- 動態鏈接:節省內存、更新方便,但是動態鏈接是在程序運行時,每次執行都需要鏈接,相比靜態鏈接會有一定的性能損失。
總結
- 上一篇: linux 父子进程 资源_linux
- 下一篇: C++ STL 容器 vector