目錄
前言:c++有個最大的特點,那便是編譯型語言,相比於python這種解釋型語言,c++在編譯階段就進行了許多處理,在執行階段便具有高效性,本篇主要講解c++中的編譯與鏈結;
1、一開始的c++是乙個簡單的加工模型,如下圖所示:
這樣會存在一些問題:
2、為了解決以上問題,引入了分塊處理的方式:
編譯鏈結模型的好處:
在引入分塊處理後,出現了一些常見概念:
①定義與宣告:乙個變數在只需在乙個檔案中定義,其他檔案可通過宣告該變數;
②標頭檔案與原始檔:由於宣告的變數、函式過多,可將宣告放在標頭檔案中,在原始檔中引用標頭檔案載入這些宣告;
③翻譯單元:原始檔 + 相關標頭檔案(直接/間接)- 應忽略的預處理www.cppcns.com語句(巨集定義不符合條件的);
下面通過乙個實際例子,講解程式如何從cpp一步步到可執行檔案的;
下圖為乙個整體流程圖:
1、預處理階段:將cpp或c的源程式進行處理(標頭檔案展開等),轉換成以i結尾的翻譯單元檔案
g++ -e ./main.cpp opivtmj-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語言編譯與鏈結
預處理過程主要處理那些源 檔案只能夠的以 開始的預編譯指令。比如 include define 等,主要處理規則如下 1 將所有的 define 刪除,並且展開所有的巨集定義 2 處理所有條件預編譯指令,比如 if ifdef elif else endif 3 處理 include 預編譯指令,將...
編譯與鏈結
首先,我們可以將所有東西都放在乙個.cpp檔案內.然後編譯器就將這個.cpp編譯成.obj,obj是什麼東西?就是編譯單元了.乙個程式,可以由乙個編譯單元組成,也可以有多個編譯單元組成.假如你不想讓你的源 變得很難閱讀的話,就請使用多個編譯單元吧.乙個函式不能放到兩個編譯單元裡面,但兩個以上就可以分...
C 編譯鏈結
過程 一 預編譯 預處理 處理 define if include這類 開頭的語句,這些稱為預編譯指令。這個過程中會把.h檔案和.c cpp檔案組合成最終交給compile過程的原檔案。這個原檔案是不包含任何 開頭的語句的。所有 define定義的巨集也會被替換。二 編譯 把上面那個原檔案編譯成.o...