C++中的編譯與鏈接
前言:
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++的編譯與鏈接過程是復雜的,預處理、編譯與鏈接都可能出錯,要細心排除;
- 編譯可能產生警告、錯誤,都要重視;
- 我個人的感受,會遇到一些很奇怪的坑,不管從環境還是依賴庫,這就需要有耐心不斷嘗試,並且總結經驗;
到此這篇關於C++中的編譯與鏈接的文章就介紹到這瞭,更多相關C++ 編譯與鏈接內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Android studio導出APP測試包和構建正式簽名包
- Python實現不寫硬盤上傳文件
- 利用Python寫個摸魚監控進程
- VS Code 中搭建 Qt 開發環境方案分享
- 詳解如何在VS2019和VScode中配置C++調用python接口