linux下編譯器的使用

源文件編譯的過程

使用C語言編寫一段程序稱之爲源程序,這個程序是不能直接執行的,需要編譯成可執行代碼,過程:源程序->預處理->編譯->彙編->彙編->鏈接->可執行代碼。

  1. 拿到一個源程序首先需要進行預處理,預處理的結果便是將頭文件的內容放入這個文件中,比如一個C語言程序通常需要包含stdio.h頭文件,這個頭文件裏包含一些函數和變量的聲明,預處理便會將這個文件裏的內容放入。
  2. 編譯階段,這個階段是將我們的C語言代碼翻譯成彙編代碼。
  3. 彙編階段,彙編階段表示將彙編的代碼翻譯成機器代碼,現在已經是一個二進制文件。
  4. 鏈接階段,鏈接表示將一些函數的實現和目標代碼鏈接在一起,預處理階段只是將函數的聲明放入文件中,並沒有將函數的實現放入其中因此需要進行鏈接才能執行。
  5. 經過鏈接階段以後便是可以執行的代碼了。

gcc講解

直接生成可執行代碼
gcc test.c
會自動生成a.out文件 這個文件可以直接執行

生成指定文件名的可執行文件
gcc test.c -o test
會生成test的可執行文件

只對文件進程預處理
gcc test.c -o test.i -E
生成一個test.i的文件,這個文件包含指定頭文件的內容

生成彙編文件
gcc test.i -S -o test.s
生成一個彙編表示的文件

生成目標文件
gcc test.s -c test.o
生成一個二進制的目標文件 這個文件不能直接執行 因爲沒有進行鏈接

生成可執行文件
gcc test.o -o test
生成可執行文件

在預處理階段需要將頭文件的內容插入到源代碼中,系統默認搜索的路徑是/usr/include,大部分頭文件都在這個文件中,在源文件中包含的方式爲<stdio.h>這種形式默認是搜索的這個路徑,還有一種包含方式 "head.h"這種形式默認是搜索的本目錄,有的時候可以直接指定要包含的頭文件eg:gcc test.c -o test -l dir 表示在指定的目錄下搜索頭文件。

同樣在鏈接階段需要鏈接文件,也會一個默認的目錄去搜索,同樣可以指定一個目錄eg:gcc test.c -o test -L dir 其中-L表示增加要搜索的函數庫。

make工程文件

在linux下使用make命令會執行Makefile文件

Makefile文件的編寫規則

test:   mid.o add.o test.o    	//生成的文件test後面是依賴的文件
        gcc mid.o add.o test.o -o test   //執行的命令   鏈接操作
test.o: test.c am.h
        gcc test.c -c -o test.o
mid.o:  mid.c
        gcc mid.c -c -o mid.o
add.o:  add.c
        gcc add.c -c -o add.o

看下面一個例子

test.c
#include"am.h"
#include<stdio.h>
int main()
{
int a=2,b=4;
printf("%d\n",add(a,b));
printf("%d\n",mid(a,b));
}

mid.c
int mid(int a,int b)
{
        return (a+b)/2;
}

add.c
int add(int a,int b)
{
        return a+b;
}


am.h
int add(int a,int b);
int mid(int a,int b);


Makefile

test:   mid.o add.o test.o    	//生成的文件test後面是依賴的文件
        gcc mid.o add.o test.o -o test   //執行的命令   鏈接操作
test.o: test.c am.h
        gcc test.c -c -o test.o
mid.o:  mid.c
        gcc mid.c -c -o mid.o
add.o:  add.c
        gcc add.c -c -o add.o

執行結果:
sun@ubuntu:~/project$ make
gcc mid.c -c -o mid.o
gcc add.c -c -o add.o
gcc test.c -c -o test.o
gcc mid.o add.o test.o -o test

make執行過程:

  1. 在輸入make命令時會自動尋找makefile或者Makefile文件
  2. 在執行第一條命令之前會檢查依賴的文件是否存,在當依賴的文件不存在時會先生成需要的依賴文件。
  3. 當我們更新一個已將編譯好的工程時,再執行make命令,會檢查依賴文件更新的時間是否比生成目標的時間晚,如果比目標的時間晚時會執行編譯操作,表示這個文件更新了需要重新生成。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章