使用c語言進行編譯的簡單實例:
編寫程序源代碼:hello world
開始編譯和測試執行
在默認狀態下,如果直接以gcc編譯源碼,並沒有加上任何參數,則執行文件會默認為a.out這個文件名。
然後執行這個a.out文件就行
那麼如果我想產生目標文件object file來進行其他操作,而且執行文件的名字也不是默認的.a.out
hello.o 就是目標文件,再利用這個目標文件制作出一個名為hello的執行文件。
那麼為什麼要多此一舉,得到目標文件呢?
因為源碼文件可能並非只有一個文件,無法直接進行編譯,這個時候需要先生成目標文件,然後再以鏈接制成二進制可執行文件。
比如這個例子:
vim thanks.c
vim thanks2.c
可以看出,thanks.c代碼的主函數中調用了thanks2.c中的函數。
對兩份源碼進行編譯成目標文件
此時這只是兩個獨立的目標文件,thanks.o、thanks2.o
要將他們鏈接成一個二進制可執行文件
如果有一天,更新了thanks.c這個源碼的內容,那麼你只要重新編譯thanks2.,c來產生新的thanks2.o,然後再用gcc -o重新鏈接生成新的二進制執行文件即可,不必編譯其他沒有改過的源碼文件。
調用外部函數庫:
如果要計算數學公式,比如三角函數和指數函數,就要加入函數庫來計算。
比如主程序是這樣的:
sin函數在linux中是寫在libm.,so這個函數庫當中的,由於沒有在源碼中將這個函數庫加進去,因此需要在編譯與鏈接時將這個函數庫鏈接進執行文件裡面。
-lm:-l 加入某個函數庫(library),m表示libm.so這個函數庫
-L/lib -L/usr/ilb 表示我要的函數庫libm.so在/lib或者/usr/lib中搜索。
需要注意的是,linux默認是將函數庫放置在/lib與/usr/lib當中,所以麼有寫-L/lib -L/usr/ilb,也是沒有關系的,如果你自定義的函數庫不是放在這兩個目錄下, 那麼-L/path就很重要了。
gcc的簡單用法:
在上面我們使用了 gcc -c ;gcc -o等
gcc -c:僅將源碼編譯成為目標文件,並不制作鏈接功能,即會生成hello.o文件,但不會生成可執行文件。
gcc -o hello hello.c 將編譯結果輸出成某個特定的文件名,-o後面跟的要輸出的binary file文件名
gcc sin.c -lm -L/lib -L/usr/lib -I/usr/include 在進行編譯時,將鏈接的函數庫和頭文件寫入
-lm 指的是libm.so函數庫,-L函數庫的搜索目錄,-I源碼內include文件目錄。