Linux下多個.c文件的編譯和Makefile文件


在編程的時候,我們可以把一個完整程序的每個函數分離出來,寫成.c文件,最后再一起編譯和鏈接。這樣有利於程序功能模塊化,也方便檢查代碼錯誤。

.h文件:里面編輯該程序需要引用的頭文件。

#ifndef  /#define / #endif : 防止該頭文件被重復引用。

整體用法:

#ifndef  A_H             //如果沒有a.h文件,#define A_H。如果有,結束定義

#define  A_H            //定義a.h文件

 

定義a.h需要的頭文件

 

#endif                 //結束定義部分

 

例子:

一個.h文件的書寫格式。

#ifndef    A_H

#define   A_H

定義程序所需的一些頭文件

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#endif

保存退出。

其實在編寫小程序的時候也可以不用#ifndef  /#define / #endif,但是用它更安全,不易出錯。

 

.c文件的書寫格式

在寫每個函數之前要加載頭文件,如果是.h文件,就需要寫#include”a.h”。

 

例如:引用之前的a.h文件。

add.c

#include”a.h”

int add(int a,intb)

{

return a+b;

}

保存退出。

程序編輯完成之后,需要編譯鏈接。

我們可以用gcc編譯每個.c文件。如果有三個.c文件a.c、b.c、c.c,編譯方法如下:

gcc  a.c  –o  a.o                    //將三個.c文件編譯成.o文件

gcc  b.c  -o  b.o

gcc  c.c  -o  c.o

gcc  a.o  b.o  c.o  –o  all         //將三個.o文件編譯成一個可執行文件

./all                             //執行程序

 

 

例如:

test.h

 

add.c

 

main.c

 

編譯:

 

執行:

 

如果我們有很多個.c文件,這個方法就不太好了,這時,我們提出Makefile文件。

Makefile:自動編譯。先將每個.c文件的編譯過程提前寫在Makefile文件中,在運行程序時,系統直接用make命令使文件自動編譯,提高效率。

Makefile文件的書寫格式:

vim   Makefile

文件類型:由哪個文件得到

得到過程

 

例如:

main:main.o                    //可執行文件main是由目標文件main.o得到。

gcc  main.o  –o  main         //得到過程是將main.o編譯成main文件。

main.o:main.c

gcc  -c  main.c  -o  main.o

 

在Makefile文件中一定要將每一個.c文件按執行順序先編譯成.o文件,再按順序將.o文件編譯成可執行文件。

每次編譯過后會產生很多的.o文件,對於程序運行沒什么太大意義,反而會占內存,所以我們也可以在Makefile文件中添加清除命令(clean),如:

.PHONY:clean

clean:                刪除所有文件類型為.o的文件

 rm  –rf   *.o

 

一些文件也可用下面符號表示:

$@: 代表規則里面的目標文件。

$<:代表規則當中的第一個依賴文件。

%.c:%.o   所有.c文件全部編譯成.o文件

 .PHONY:clean

如果有.PHONY:clean,外面也有clean文件,執行make clean時,里面的.o文件會被刪除而外面的clean文件還在。確保了外面clean文件的安全性。如果沒有.PHONY:clean 語句,外面也沒有clean文件時,在執行make clean也會刪除.o文件,如果外面有clean,則會報錯。

 PHONY:目標並非實際的文件名,只是顯示在請求時執行命令的名字。有兩種理由需要使用PHONY目標:避免和文件名沖突,改善性能。

例如:

vim Makefile

 

編譯和執行(make:編譯,   ./all:執行):

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM