當前位置:
首頁 > 最新 > mac下編譯C語言的幾種方式

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 。

指定名字:


在開發過程中,不可能將所有的代碼都寫在一個.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:前端面試題寶典 |