一、編譯和鏈結
ide一般將編譯和鏈結的過程一步完成,通常將這種編譯和鏈結合併到一起的過程稱為構建(build)。
預編譯(prepressing)
處理源**中以」#
「開頭的預編譯指令
刪除」#define
「 展開所有巨集定義;
處理條件預編譯指令,比如「#if
」「#ifdef
」等;
處理「#include
」,包含標頭檔案;
刪除所有注釋;
新增行號和檔名標識,便於編譯器產生除錯用的行號資訊;
保留所有#pragma
編譯器指令。
編譯(compilation)
把預處理檔案進行一系列詞法分析、語法分析、語義分析及優化後產生相應的彙編**檔案。
彙編(assembly)
彙編器將彙編**轉變成機器可以執行的指令。
鏈結(linking)
組裝模組,過程主要包括位址和空間分配,符號決議和重定位。對引用位址進行重定位指向實際位址。
extern 「c」
c++**在進行編譯時會對變數和函式符號進行修飾,修飾規則與c語言不同,c++為了與c相容,有乙個用來宣告或定義乙個c的符號的」extern "c"
「 關鍵字 。
extern
"c"
標頭檔案宣告了一些c語言編寫的函式或全域性變數,為了讓這個標頭檔案能正常被c++與c語言**包含,可以使用c++的巨集」__cplusplus
「,c++編譯器會在編譯c++程式時預設定義這個巨集,通過使用條件巨集可以判斷當前編譯的是不是c++**。
#ifdef __cplusplus
extern
"c"
#endif
二、靜態鏈結庫乙個靜態庫可以簡單地看成一組目標檔案的集## 標題 ##合,即很多目標檔案經過壓縮打包後形成的乙個檔案。linux下使用「ar」壓縮程式將目標檔案壓縮到一起,並且對## 標題 ##其進行編號和索引,以便於查詢和檢索。(與自己對靜態庫的理解有差錯,不是簡單的函式**集合。這也是方便於程式在對靜態庫進行鏈結時,只包含所使用到得函式**,而不是靜態庫中的全部函式**)
三、程序的建立
建立虛擬位址空間,並不是建立實際的物理空間,而是建立對映函式所需要的相應的資料結構。頁對映函式將虛擬空間的各個頁對映至相應的物理空間。
讀取可執行檔案頭,並且建立空間與可執行檔案的對映關係。這一步所做的是虛擬空間與可執行檔案的對映關係。當對所需的頁進行裝載時,易定位到其在可執行檔案中的位置。
將cpu指令暫存器設定成可執行檔案入口,啟動執行。
上面步驟執行完以後,其實可執行檔案的真正指令和資料都沒有被裝載入到記憶體中。作業系統是通過捕獲程式執行時產生的頁錯誤,通過先前建立的對映關係計算出相應的頁面在可執行檔案中的偏移,然後在物理記憶體中分配乙個物理頁面,將其載入再將程序中該虛擬頁與分配的物理頁之間建立對映關係。程序從剛產生頁錯誤的位置重新開始執行。
四、系統呼叫,win32 api,c執行庫
linux下的c執行庫是glibc,它是完全支援posix標準,除了實現c標準庫之外,還提供對linux系統呼叫的封裝函式(例如read,write,標頭檔案unistd.h)
windows下的c執行庫是msvcrt 實現了c標準庫之外還實現了執行緒相關操作函式。
系統呼叫 是應用程式(執行庫也是應用程式的一部分)與作業系統核心之間的介面,它決定了應用程式時如何與核心打交道的。無論程式是直接進行系統呼叫,還是通過執行庫,最終還是會達到系統呼叫這個層面上。
linux的系統呼叫的c語言形式被定義在unistd.h
中,應用程式可以繞過c標準庫的相關函式如fopen
,而直接使用open
來實現檔案的讀取。
windows api (win32是使用最廣泛也是最成熟的版本)是windows作業系統提供給應用程式開發者的最底層、最直接與windows打交道的介面。crt是建立在windows api之上的。mfc是對api一種c++形式的封裝庫。標頭檔案」windows.h」包含了windows api的核心部分。
程式設計師的自我修養 讀書筆記
第一部分 溫故而知新 第一章 介紹基本的背景知識 作業系統 執行緒 硬體 1 關於c語言中的hello world這些問題你都清楚嗎?2 計算機硬體裝置的三個核心部件 1 處理器cpu 2 記憶體 3 i o控制晶元 4 作業系統的功能 1 提供抽象介面。2 管理硬體資源 5 多道程式 分時系統 多...
《程式設計師的自我修養》讀書筆記
1 最佳實踐 作為一名程式設計師,你也需要嘗試去理解那些軟體領域最本質的東西,而我的建議就是學習那些最佳實踐。最佳實踐 bestpractice 是乙個管理學概念,即 可使結果最優,並減少出錯可能性的某種技術或方法。最佳實踐一定是要經受住實踐檢驗才得出的。學習本質 是 以慢打快 的策略,但這種策略短...
程式設計師的自我修養 讀書筆記
哦,笑吧,科廷,老夥計。這是上帝,或者也可以說是命運或自然,跟我們開的乙個玩笑。不過,不管這傢伙是誰或是什麼,他真幽默,哈哈!霍華德,碧血沙金 專業主義不但象徵著榮譽與驕傲,而且明確意味著責任與義務。假如不小心在程式中寫了乙個bug,以致於公司損失10萬,對於非專業人士來說,只會聳聳肩 狀況總是難免...