日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

前文我們講了如何使用 GCC 編譯器在 linux 進行 C 語言編譯,通過在終端執行 gcc 命令來完成C 文件的編譯,如果我們的工程只有一兩個 C 文件還好,需要輸入的命令不多,當文件有幾十、上百甚至上萬個的時候用終端輸入 GCC命令的方法顯然是不現實的。如果我們能夠編寫一個文件,這個文件描述了編譯哪些源碼文件、如何編譯那就好了,每次需要編譯工程的時只需要使用這個文件就行了。這種問題怎么可能難倒聰明的程序員,為此提出了一個解決大工程編譯的工具:Make,描述哪些文件需要編譯、哪些需要重新編譯的文件就叫做 Makefile,Makefile 就跟腳本文件一樣,Makefile 里面還可以執行系統命令。使用的時候只需要一個 Make命令即可完成整個工程的自動編譯,極大的提高了軟件開發的效率。如果大家以前一直使用 IDE來編寫 C 語言的話肯定沒有聽說過 Makefile 這個東西,其實這些 IDE 是有的,只不過這些 IDE對其進行了封裝,提供給大家的是已經經過封裝后的圖形界面了,我們在 IDE 中添加要編譯的C 文件,然后點擊按鈕就完成了編譯。在 Linux 下用的最多的是 GCC 編譯器,這是個沒有 UI的編譯器,因此 Makefile 就需要我們自己來編寫了。作為一個專業的程序員,是一定要懂得Makefile 的,一是因為在 Linux 下你不得不懂 Makefile,再就是通過 Makefile 你就能了解整個工程的處理過程。

我們完成這樣一個小工程,通過鍵盤輸入兩個整形數字,然后計算他們的和并將結果顯示在屏幕上,在這個工程中我們有 main.c、input.c 和 calcu.c 這三個 C 文件和 input.h、calcu.h 這兩個頭文件。其中main.c 是主體,input.c 負責接收從鍵盤輸入的數值,calcu.h 進行任意兩個數相加,其中main.c 文件內容如下:

 #include <stdio.h>
 #include "input.h"
#include "calcu.h" 4
 int main(int argc, char *argv[])
 {
 int a, b, num;
 input_int(&a, &b);
 num = calcu(a, b);
 printf("%d + %d = %drn", a, b, num) ;
 }

input.c 文件內容如下

#include <stdio.h>
#include "input.h"

void input_int(int *a, int *b)
{
 printf("input two num:"); 
 scanf("%d %d", a, b);
 printf("rn");
 }

calcu.c 文件內容如下:

#ifndef _INPUT_H
 #define _INPUT_H
 void input_int(int *a, int *b);
 #endif

文件 calcu.h 內容如下:

 #ifndef _CALCU_H
#define _CALCU_H

int calcu(int a, int b);
#endif

以上就是我們這個小工程的所有源文件,我們接下來使用前面講的方法來對其進行編譯,在終端輸入如下命令:

 gcc main.c calcu.c input.c -o main 

上面命令的意思就是使用gcc 編譯器對 main.c、calcu.c 和 input.c 這三個文件進行編譯,編譯生成的可執行文件叫做 main。編譯完成以后執行 main 這個程序,測試一下軟件是否工作正常,結果如圖所示:

Linux下Makefile文件的的基礎知識與語法詳解

程序測試

可以看出我們的代碼按照我們所設想的工作了,使用命令“gcc main.c calcu.c input.c -o main”看起來很簡單是吧,只需要一行就可以完成編譯,但是我們這個工程只有三個文件啊!如果幾千個文件呢?再就是如果有一個文件被修改了以,使用上面的命令編譯的時候所有的文件都會重新編譯,如果工程有幾萬個文件(Linux 源碼就有這么多文件!),想想這幾萬個文件編譯一次所需要的時間就可怕。最好的辦法肯定是哪個文件被修改了,只編譯這個被修改的文件即可,其它沒有修改的文件就不需要再次重新編譯了,為此我們改變我們的編譯方法,如果第一次編譯工程,我們先將工程中的文件都編譯一遍,然后后面修改了哪個文件就編譯哪個文件,命令如下:

gcc -c main.c gcc -c input.c gcc -c calcu.c
gcc main.o input.o calcu.o -o main

上述命令前三行分別是將 main.c、input.c 和 calcu.c 編譯成對應的.o 文件,所以使用了“-c”選項,“-c”選項我們上面說了,是只編譯不鏈接。最后一行命令是將編譯出來的所有.o 文件鏈接成可執行文件main。假如我們現在修改了 calcu.c 這個文件,只需要將 caclue.c 這一個文件重新編譯成.o 文件,然后在將所有的.o 文件鏈接成可執行文件即,只需要下面兩條命令即可:

gcc -c calcu.c
gcc main.o input.o calcu.o -o main

但是這樣就又有一個問題,如果修改的文件一多,我自己可能都不記得哪個文件修改過了,然后忘記編譯,然后……,為此我們需要這樣一個工具:

1、如果工程沒有編譯過,那么工程中的所有.c 文件都要被編譯并且鏈接成可執行程序。

2、如果工程中只有個別C 文件被修改了,那么只編譯這些被修改的C 文件即可。

3、如果工程的頭文件被修改了,那么我們需要編譯所有引用這個頭文件的 C 文件,并且鏈接成可執行文件。

很明顯,能夠完成這個功能的就是 Makefile 了,在工程目錄下創建名為“Makefile”的文件,文件名一定要叫做“Makefile”!!!區分大小寫的哦!如圖所示:

Linux下Makefile文件的的基礎知識與語法詳解

Makefile 文件

上述代碼中所有行首需要空出來的地方一定要使用“TAB”鍵!不要使用空格鍵!這是Makefile 的語法要求,編寫好得 Makefile 如圖所示:

Linux下Makefile文件的的基礎知識與語法詳解

Makefile源文件

Makefile 編寫好以后我們就可以使用 Make 命令來編譯我們的工程了,直接在命令行中輸入“Make”即可,Make 命令會在當前目錄下查找是否存在“Makefile”這個文件,如果存在的話就會按照 Makefile 里面定義的編譯方式進行編譯,如圖所示:

Linux下Makefile文件的的基礎知識與語法詳解

make命令編譯工程

在圖中,使用命令“Make”編譯完成以后就會在當前工程目錄下生成各種.o 和可執行文件,說明我們編譯成功了。使用 Make 命令編譯工程的時候可能會提示如圖所示錯誤:

Linux下Makefile文件的的基礎知識與語法詳解

make命令編譯失敗

圖中的錯誤來源一般有兩點:

1、Makefile 中命令縮進沒有使用 TAB 鍵!

2、VI/VIM 編輯器使用空格代替了TAB 鍵,修改文件/etc/vim/vimrc,在文件最后面加上如下所示代碼:

 set noexpandtab 

我們修改一下 input.c 文件源碼,隨便加幾行空行就行了,保證 input.c 被修改過即可,修改完成以后再執行一下“Make”命令重新編譯一下工程,結果如圖所示:

Linux下Makefile文件的的基礎知識與語法詳解

重新編譯工程

從圖中可以看出因為我們修改了 input.c 這個文件,所以 input.c 和最后的可執行文件 main 重新編譯了,其它沒有修改過的文件就沒有編譯。而且我們只需要輸入“make”這個命令即可,非常方便。

分享到:
標簽:文件 Makefile
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定