以helloword.c 程式說明編譯過程
在預設的狀態下,如果我們直接以gcc編譯原始碼,並且沒有加上任何引數,則執行檔案的檔名會被自動設定為a.out 這個檔名。所以你就能夠直接執行 ./a.out這個這行檔案。
hello.c 就是原始碼,gcc是編譯程式,a.out 是編譯成功的可執行檔案。
如果我們想要產生目標檔案(object file),而且執行檔案的檔名也不要用預設的a.out.
這個步驟主要是利用hello.o 這個目標檔案製作出乙個名為hello 的執行檔案。通過這個操作我們可以得到hello 及 hello.c 兩個檔案,真正可以執行的是hello 這個二進位制檔案。
thanks.c 主程式
#includeint main(void)
thanks2.c 子程式
#includevoid thanks2(void)
進行程式的編譯與鏈結(link)
知道為什麼要製作出目標檔案了嗎?由於我們的原始碼檔案有時並非僅只有乙個檔案,所以我們無法直接進行編譯。這個時候就需要先生成目標檔案,然後再以鏈結製作成為二進位制可執行檔案。另外,如果有一天,你更新了thanks2.c 這個檔案的內容,則你只要重新編譯thanks2.c 來產生新的thanks2.o ,然後再以鏈結製作出新的二進位制可執行檔案即可,而不必重新編譯其他沒有改動過的原始碼檔案。
這是因為c 語言裡面的sin 函式是寫在 libm.so 這個函式庫中,而我們並沒有在原始碼裡面將這個函式庫功能加進去,所以當然就需要在編譯與鏈結的時候將這個函式庫鏈結僅執行檔案裡面。
特別注意,使用gcc 編譯時所加入的那個-lm 是有意義的,它可以拆開成兩部分來看:
-l: 是加入某個函式庫(library)的意思;
m: 則是libm.so 這個函式庫,其中,lib 與副檔名(.a或.so )不需要寫。
所以-lm 表示使用 libm.so(或 libm.a)這個函式庫的意思。至於那個-l 後面接的路徑,這表示我要的函式庫 libm.so 請到 /lib 或/usr/lib 裡面搜尋。
c編譯過程
編譯的概念 編譯程式讀取源程式 字元流 對之進行詞法和語法的分析,將高階語言指令轉換為功能等效的彙編 再由匯程式設計序轉換為機器語言,並且按照作業系統對可執行檔案格式的要求鏈結生成可執行程式。編譯的完整過程 c源程式 預編譯處理 c 編譯 優化程式 s asm 匯程式設計序 obj o a ko 鏈...
c 編譯過程
編譯過程主要分為 4個過程 1 編譯預處理 預編譯程式完成的工作,可以說成是對源程式的 替換 工作。經過這個過程,生成乙個沒有巨集定義 沒有條件編譯指令 沒有特殊符號的輸出檔案。2 編譯 優化階段 通過詞法分析 語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間 或彙編 在c 中,以...
c 編譯過程
用c 編譯源 檔案分為四個步驟。例如,如果您有乙個命名的c 源 檔案prog1.cpp,則執行compile命令 g wall std c 11 o prog1 prog1.cpp 編譯過程如下所示 c 預處理器將包含的標頭檔案的內容複製到源 檔案中,生成巨集 並替換使用 define它們的值定義的...