開篇
?C++有個最大的特點,那便是編譯型語言,相比于Python這種解釋型語言,C++在編譯階段就進行了許多處理,在執行階段便具有高效性,本篇主要講解C++中的編譯與鏈接;
編譯與鏈接模型
1、一開始的C++是一個簡單的加工模型,如下圖所示:

這樣會存在一些問題:
- 無法處理大型程式
- 加工耗時較長
- 即使少量修改,也需要全部重新加工
2、為了解決以上問題,引入了分塊處理的方式:

編譯鏈接模型的好處:
- 編譯耗資源但一次處理輸入較少
- 鏈接輸入較多但處理速度快
- 便于程式修改(只需修改一部分)
在引入分塊處理后,出現了一些常見概念:
①定義與宣告:一個變數在只需在一個檔案中定義,其他檔案可通過宣告該變數;
②頭檔案與源檔案:由于宣告的變數、函式過多,可將宣告放在頭檔案中,在源檔案中參考頭檔案加載這些宣告;
③翻譯單元:源檔案 + 相關頭檔案(直接/間接)- 應忽略的預處理陳述句(宏定義不符合條件的);
編譯與鏈接流程
下面通過一個實際例子,講解程式如何從cpp一步步到可執行檔案的;
下圖為一個整體流程圖:

1、預處理階段:將cpp或c的源程式進行處理(頭檔案展開等),轉換成以i結尾的翻譯單元檔案
g++ -E ./main.cpp -o ./main.i
2、編譯階段:生成編譯后以s為后綴的匯編代碼檔案
g++ main.i -S -o main.s
3、匯編階段:將匯編代碼進行匯編生成以o為后綴目標檔案
4、鏈接階段:合并多個目標檔案,關聯宣告與定義,生成可執行程式
以上為系統內部具體的實作操作,我們在實際運行中可以通過一行命令實作編譯鏈接:
g++ ./main.cpp -o ./main
注意點:在用IDE編譯程式時,往往會有兩種模式:Debug和Release,Debug在開發中使用,優化較少,Release在最終程式編譯使用,優化較多;
總結
- C++的編譯與鏈接程序是復雜的,預處理、編譯與鏈接都可能出錯,要細心排除;
- 編譯可能產生警告、錯誤,都要重視;
- 我個人的感受,會遇到一些很奇怪的坑,不管從環境還是依賴庫,這就需要有耐心不斷嘗試,并且總結經驗;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/352141.html
標籤:其他
下一篇:LeetCode刷題day15
