mac下編譯C語言的幾種方式
本期帶來mac下C語言的編譯方法,C語言本不屬於前端範疇,但是作為一個有追求的軟體工程師,多掌握一些,更有助於我們很容易地閱讀各種類庫、框架的源碼。
mac下編譯C語言
編譯過程如下:
1、預處理
使用 -E 生成 .i 文件。
如gcc -E a.c -o a.i
2、彙編
使用 -S 生成 .s 文件。
如gcc -S a.i -o a.s
3、編譯
使用 -c 生成 .o 文件。
如 gcc -c a.s -o a.o
4、鏈接
首先明白一個概念,什麼是鏈接?
源文件編譯成功後,會生成一個對應的 .o 目標文件,這就是一個二進位文件,但是,還是不能運行。目標文件不能運行的主要原因有2個:
1、 在開發過程中,不可能將所有的代碼都寫在一個.c文件中,為了模塊化開發,一般會將不同的功能寫到不同的源文件中。源文件編譯之後,每個源文件都有對應的 .o 文件,比如 a.c 生成了 a.o、b.c 生成了 b.o,這些 .o 文件都不能單獨運行,它們之間都有密不可分的關係,需要將所有相關聯的 .o 目標文件組合在一起。
2> 除開組合所有的目標文件之後,還需要將C語言的函數庫包含進來,才能生成可執行文件。
將所有相關聯的 .o 目標文件、以及C語言函數庫組合在一起生成可執行文件的過程,我們稱為【鏈接】。
鏈接命令:
使用 -o 生成可執行文件,默認為a.out 。
指定名字:
mac下編譯多個文件
在開發過程中,不可能將所有的代碼都寫在一個.c文件中,為了模塊化開發,一般會將不同的功能寫到不同的源文件中。如果要同時編譯多個源文件,這樣寫:,源文件編譯之後,每個源文件都會生成對應的 .o 文件,比如 a.c 生成了 a.o、b.c 生成了 b.o。
mac下編譯多個文件有三種方式。
直接編譯
動態鏈接庫
靜態庫
直接編譯方法
1、首先入口文件要先 include 其他依賴文件的頭文件,如果沒有聲明頭文件也可以,但是要在入口文件中聲明依賴文件的函數或者變數。
避免入口文件中導致的報錯 。
注意 #include 「add.h」 和 #include兩種引用方式的區別:
「add.h」 是先搜索本地目錄,如果沒有,才會搜索系統目錄。
則不搜索本地目錄,而是搜索系統目錄。
2、執行 gcc a.c b.c c.c main.c -o test
即可生成可執行文件test。
動態共享庫
假設有三個庫文件a.c,b.c,c.c 和一個入口文件 main.c。
動態共享庫的方式:
1、先把三個文件a.c,b.c,c.c編譯成動態共享庫
2、main.c中要引入頭文件或者聲明外部函數
3、鏈接入口文件main.c和動態庫。
好處是如果b.c有更新,則不用鏈接入口文件和動態庫,只需要重新生成b.so即可。
靜態庫
假設有三個庫文件a.c,b.c,c.c和一個入口文件 main.c
靜態庫的鏈接方法為:
1、先把三個庫文件編譯成a.o,b.o,c.o。
2、打包目標文件
程序 ar 配合參數 -r 創建一個新庫 liball.o 文件,並將命令行中列出的文件打包入其中。這種方法,如果 liball.o 已經存在,將會覆蓋現在文件,否則將新創建。
3、鏈接靜態庫
以上就是 mac 下編譯 C 文件的三種方式。我們可以先從這三種簡單方式入手,為以後邊寫 nodejs 原生擴展打點基礎。
TAG:前端面試題寶典 |