linux編程之make的使用

程序維護工具make

Linux環境下編寫代碼使用GUN的make可以比較方便的構建自己的項目。通常一個應用程序會包含許多文件,當只有一個源文件的時候,當然還是選擇手動編譯鏈接,當應用程序有相當多的文件的時候,通過gcc手動編譯就顯得相當困難。如果其中某個文件被修改,就需要對文件進行重新編譯鏈接,此時如果手動編譯的話就相當浪費時間。使用程序維護工具make,我們需要定義一個makefile或者Makefile文件,在makefile寫清楚規則來指定哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯等。make就像一個shell腳本,這裏面的內容不僅相當清楚地描述整個工程的依賴關係,而且可以執行操作系統的命令編譯鏈接解決這些依賴關係。我們可以把它理解成shell腳本,而“腳本”裏的命令就是我們手動編譯鏈接過程中需要敲的那些命令,這樣就可以敲一次命令到“腳本”中去,然後只需要一個make命令,自動執行命令,自動編譯鏈接。下面我寫了一個簡單的demo

這個demo一共包含main.c、mytool1.c、mytool2.c、mytool1.h、mytool2.h五個源文件和一個makefile文件(在同一個目錄下)。

main.c文件

#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
	mytool1_print("hello");
	mytool2_print("hello");
}
mytool1.c文件

#include<stdio.h>
#include "mytool1.h"
void mytool1_print(char *print_str)
{
	printf("This is mytool1 print %s\n",print_str);
}
mytool2.c文件

#include <stdio.h>
#include "mytool2.h"
void mytool2_print(char *print_str)
{
	printf("This is mytool2 print %s\n",print_str);
}
mytool1.h文件

#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *printf_str);
#endif
mytool2.h文件

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
接下來就是我們的重點makefile文件

main:main.o mytool1.o mytool2.o
	gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
	gcc -c main.c
mytool1.o:mytool1.c mytool1.h
	gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
	gcc -c mytool2.c
有了這五個文件我們就可以測試了,運行make編譯鏈接並運行,如下所示。

[bulecat@CentOS testMake]$ make
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
[bulecat@CentOS testMake]$ ./main
This is mytool1 print hello
This is mytool2 print hello
[bulecat@CentOS testMake]$ 

我們來解釋一下makefile文件的內容。main:main.o mytool1.o mytool2.o這一行代碼描述了產生main這個可執行文件需要鏈接main.o,mytool1.0,mytool2.o這三個對象文件,接下來的gcc -o main main.o mytool1.o mytool2.o命令就是系統要完成上述描述要執行的命令。然而main.o這個對象文件本身並不存在呀,它從哪裏來呢?接下來一句main.o:main.c mytool1.h mytool2.h就描述了它的“來歷”,就是它的依賴關係,同理gcc -c main.c就是系統實際上執行的那條命令。


在這裏我們簡單補充一下gcc命令中參數-c,-o的區別:-c只編譯不鏈接,生成.o(obj)文件,-o既編譯又鏈接,生成可執行文件。

現在我們已經會簡單實用make工具了。那麼make的工作機制是什麼呢?

make的主要功能是執行成成新版本的目標程序所需的各個步驟,即自動檢測一個大型程序的哪一部分需要重新編譯,然後發出命令重新編譯。GUN的make的工作過程如下:

1、依次讀入每個makefile文件。

2、初始化文件中的變量。

3、推導隱式規則,並分析所有的規則。

4、位所有目標文件創建依賴關係鏈。

5、根據依賴關係和時間數據,確定哪些文件需要重新生成。

6、執行相應的生成命令。


什麼是隱式規則?

隱式規則爲make提供了重建目標文件的通用方法,不需要在makefile中明確的給出重建特定目標文件所需要的描述細節。make預先設置了很多隱含規則,如果不明確寫下規則,make就會在隱含規則中尋找所需要的規則和命令。下面是幾個常用的隱含規則:

1、編譯c程序,.o文件自動由.c文件生成。

2、編譯c++程序,.o文件自動由.cc文件生成。

3、鏈接單一的object文件,file文件自動由file.o生成,通過c編譯器使用鏈接器,此規則僅適用由一個源文件可直接產生可執行文件的情況。


注意事項:

makefile中的變量就像一個環境變量,作用是可以用來保存文件名列表、編譯選項列表、程序運行的選項參數列表、搜索源文件的目錄列表、編譯輸出的目錄列表等。

make變量名是大小寫敏感的。




發佈了12 篇原創文章 · 獲贊 19 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章