c语言 自动化编译环境,《C编程.开始C》3.编译基础
在介紹了C編程的基本概念之后,我們現在可以簡要地討論編譯過程。
像任何編程語言一樣,C本身對于微處理器來說是完全不可理解的。它的目的是提供一種用于人類是提供一種能夠很容易地轉換成機器代碼指令以直觀的方式是理解到微處理器。該編譯器是什么翻譯我們人類可讀的源代碼轉換成機器代碼。
對于那些剛接觸編程的人來說,這似乎相當簡單。一個天真的編譯器可能會讀入每個源文件,將所有內容轉換為機器代碼,并寫出可執行文件。這可行,但有兩個嚴重的問題。首先,對于大型項目,計算機可能沒有足夠的內存來一次讀取所有源代碼。其次,如果對單個源文件進行更改,則必須重新編譯整個應用程序。
為了解決這些問題,編譯器將工作分解為步驟。對于每個源文件(每個.c文件),編譯器讀取文件,讀取它通過#include指令引用的文件,并將它們轉換為機器代碼。結果是“目標文件”(.o)。創建所有目標文件后,“鏈接器”程序將收集所有目標文件并寫入實際的可執行程序。這樣,如果您更改了一個源文件,則只需要重新編譯該文件,之后,需要重新鏈接該應用程序。
沒有詳細說明,對編譯過程有一個膚淺的理解是有益的。
預處理器
預處理器提供了包含所謂的頭文件,宏擴展,條件編譯和行控制的能力。很多時候,您需要向編譯器提供特殊指令。這可以通過在代碼中插入預處理程序指令來完成。當您開始編譯代碼時,一個稱為預處理器的特殊程序會掃描源代碼,并根據預定義的規則為其他代碼執行令牌字符串的簡單替換。C預處理器不是C語言的一部分。
所有預處理程序指令都以井號字符(#)開頭。您可以在Hello world程序中看到一個預處理程序指令。例:
#include
該指令使stdio標頭包含在您的程序中。其他指令,如#pragma控制編譯器設置和宏。預處理階段的結果是文本字符串。您可以將預處理器視為非交互式文本編輯器,為編譯準備代碼。預處理程序指令的語言與C的語法無關,因此C預處理程序也可以獨立用于處理其他類型的文本文件。
語法檢查
此步驟確保代碼有效并將序列化為可執行程序。在大多數編譯器下,您可能會收到消息或警告,指出程序可能存在的問題(例如條件語句總是為真或假等)
當在程序中檢測到錯誤時,編譯器通常會報告阻止編譯的文件名和行。
對象代碼
編譯器生成與源代碼等效的機器代碼,可以鏈接到最終程序中。此時代碼本身無法執行,因為它需要鏈接才能執行。
在討論編譯是“單行道”的基礎知識之后,請務必注意。也就是說,將C源文件編譯成機器代碼很容易,但“反編譯”(將機器代碼轉換為創建它的C源代碼)則不然。C的反編譯器確實存在,但它們創建的代碼很難理解,只對逆向工程有用。
鏈接
聯通過集成庫和代碼并產生任一種結合了單獨的對象文件合并為一個完整的程序的可執行程序或庫。鏈接由鏈接器程序執行,該程序通常是編譯器套件的一部分。
此階段的常見錯誤是缺少或重復的功能。
自動化
對于大型C項目,許多程序員選擇自動編譯,以減少用戶交互需求并通過重新編譯僅修改過的文件來加快進程。
大多數集成開發環境都有某種項目管理,這使得這種自動化非常容易。但是,項目管理文件通常只能由同一集成開發環境的用戶使用,因此任何希望修改項目的人都需要使用相同的IDE。
在類UNIX系統上,make和Makefiles通常用于完成相同的操作。Make是傳統且靈活的,可作為大多數Unix和GNU發行版的標準開發人員工具之一。
GNU Autotools擴展了Makefile?,由Automake和Autoconf組成,用于使軟件可編譯,可測試,可翻譯和可在許多類型的機器上配置。Automake和Autoconf在各自的手冊中有詳細描述。
Autotools通常被認為是復雜的,并且已經開發了各種更簡單的構建系統。GNOME項目的許多組件現在使用聲明性的Meson構建系統,該系統不太靈活,而是專注于以簡單的方式提供構建系統中最常需要的功能。用C語言編寫的程序的其他流行的構建系統包括CMake和Waf。
安裝gcc后,可以使用已編寫但尚未編譯的c源文件列表調用它。例如,如果文件main.c包含myfun.h中描述的函數并在myfun_a.c和myfun_b.c中實現,那么就足夠了
gcc main.c myfun_a.c myfun_b.c
myfun.h包含在main.c中,但如果它位于單獨的頭文件目錄中,那么該目錄可以在“-I”開關后列出。
在較大的程序中,Makefile和gnu make程序可以將c文件編譯成以后綴.o結尾的中間文件,可以通過gcc鏈接。
如何編譯每個目標文件通常在Makefile中描述,目標文件作為標簽以冒號結尾,后跟兩個空格(制表符經常導致問題),后面是依賴項的其他文件列表,例如.c文件和.c文件。 o在另一個部分編譯的文件,在下一行,調用所需的gcc。打字?man make?或?info make經常提供如何使用make以及gcc所需的信息。雖然gcc有很多選項開關,但經常使用的是-g來生成gdb的調試信息,以允許gdb在機器代碼程序的逐步執行期間顯示源代碼。gdb有一個’h’命令顯示它可以做什么,如果a.out是由gcc編譯的匿名可執行機器代碼文件,它通常以’gdb a.out’開頭。
總結
以上是生活随笔為你收集整理的c语言 自动化编译环境,《C编程.开始C》3.编译基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何保护python代码_如何在发布之前
- 下一篇: asyncio oracle 异步,带有