① c語言裡面的編譯和鏈接是怎麼回事啊
C/C++語言的完整編譯過程是
一、預編譯
處理#define #if #include這類#開頭的語句,這些稱為預編譯指令。這個過程中會把.h文件和.c/.cpp文件組合成最終交給compile過程的原文件。這個原文件是不包含任何#開頭的語句的。所有#define定義的宏也會被替換。
二、編譯
把上面那個原文件編譯成.o或者VC里是.obj文件。這個文件保存了機器碼化的函數、函數的描述、全局變數的描述、乃至段的描述等等。
三、連接
把可執行程序需要的所有的編譯過程產生的.o或者.obj文件組合到一起。(這里也包括.lib文件,.lib文件件本質上就是打包的.obj文件集合)。另外連接過程還會組合一些其他數據,比如資源、可執行文件頭等等。
② 操作系統的工作流程是什麼
為了使計算機程序得以運行,計算機需要載入代碼,同時也要載入數據,然後由處理器執行指令。整個過程可以總結為編譯、鏈接、裝載、執行。
1、編譯
編譯過程又可以被分為兩個階段:編譯、匯編。
編譯是指編譯器讀取字元流的源程序,對其進行詞法與語法的分析,將高級語言指令轉換為功能等效的匯編代碼。
匯編器是將匯編代碼轉變成機器可以執行的命令,每一個匯編語句幾乎都對應一條機器指令。匯編相對於編譯過程比較簡單,根據匯編指令和機器指令的對照表一一翻譯即可。
2、鏈接
鏈接的主要內容是將各個模塊之間相互引用的部分處理好,使得各個模塊之間能夠正確地銜接。鏈接又分為靜態鏈接和動態鏈接:
靜態鏈接是指在編譯階段直接把靜態庫加入到可執行文件中去,這樣可執行文件會比較大;
動態鏈接則是指鏈接階段僅僅只加入一些描述信息,而程序執行時再從系統中把相應動態庫載入到內存中去。
3、裝載
程序在經過鏈接後,得到了可執行文件,下一步就需要將可執行程序載入到內存中。
由於現代操作系統均採用分頁的方式來管理內存,所以操作系統只需要讀取可執行文件的文件頭,之後建立起可執行文件到虛擬內存的映射關系,而不需要真正的將程序載入內存。
4、運行
載入器將可執行目標文件中的代碼和數據從磁碟復制到內存中,然後通過跳轉到程序的第一條指令或入口點來運行程序。
在程序的運行過程中,CPU發現有些內存頁在物理內存中並不存在並因此觸發缺頁異常,此時CPU將控制許可權轉交給操作系統的異常處理函數,操作系統負責將此內存頁的數據從磁碟上讀取到物理內存中。
數據讀取完畢之後,操作系統讓CPU jmp到觸發了缺頁異常的那條指令處繼續執行,此時指令執行就不會再有缺頁異常了。
(2)編譯鏈接的概念是什麼擴展閱讀
為使計算機按預定要求工作,首先要編製程序,無論是最早的操作系統還是現代操作系統,程序的運行都是計算機工作的本質。
早期計算機是單任務執行,由程序員直接編寫操作系統可以識別的機器語言,到現在可以實現多道程序並行,並且程序的開發由更利於程序員理解的高級語言編寫,源程序在經過一系列翻譯過程,變成計算機理解的機器語言,再執行。
整個程序執行的過程,需要CPU、內存、程序代碼、設備等配合,才能實現程序要表達的功能。