makefileファイル作成チュートリアル

5110 ワード

技術交流QQ群:1027579432、あなたの参加を歓迎します!


1.make紹介

  • gcc:コンパイラ(gccはメニューに基づいてコンパイル)
  • make:linuxが付属するコンストラクタ(メニューに相当)
  • によって構築されたルール(レシピ)はmakefileにおける
  • である.

    2.makefileファイルの名前

  • makefile
  • Makefile

  • 3.makefileのルール

  • gcc a.cb.c.c-o appこの方法はファイルの多くの場合、gccコンパイルを利用すると多くのパラメータがあり、プロジェクト全体の管理に不利である.そのため、makefileファイルを作成し、プロジェクト全体のコンパイルを容易にする必要があります.
  • makefileのルール構成:ターゲット、依存、コマンド、具体的なフォーマットは以下の通りです:
     : 
    (tab )  
    
  • gcc a.cb.c.c-o appをmakeに変更してコンパイルします.すると、makefileのルールは、
    app:a.c b.c c.c
        gcc a.c b.c c.c -o app
    
  • のようになります.
  • makefileには1つ以上のルールが含まれています!

  • 4.makefileの作成

  • の具体例は以下の通りであり、第1のバージョン:
    // gcc 
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ls
    add.c  head.h  main.c  mul.c  sub.c
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ gcc add.c main.c sub.c -o app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app
    sum=36
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ rm app
    
    // make 
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile 
    app:add.c main.c sub.c
        gcc add.c main.c sub.c -o app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ls
    add.c  head.h  main.c  makefile  mul.c  sub.c
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make
    gcc add.c main.c sub.c -o app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app
    sum=36
    
  • の最初のバージョンの欠点:コンパイルステップに時間がかかり、効率が低く、そのうちの1つのファイルを変更すると、すべてのファイルが再コンパイルされます.
  • の具体例は以下の通りであり、第2のバージョン:
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile 
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile 
    app:add.o main.o sub.o
        gcc add.o main.o sub.o -o app
    
    add.o:add.c
        gcc add.c -c
    
    main.o:main.c
        gcc main.c -c
    
    sub.o:sub.c
        gcc sub.c -c
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ rm app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make
    gcc add.c -c
    gcc main.c -c
    gcc sub.c -c
    gcc add.o main.o sub.o -o app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app
    sum=36
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim add.c  #  add.c !
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make
    gcc add.c -c
    gcc add.o main.o sub.o -o app
    
  • makefile動作原理:
  • 依存(第2バージョンのadd.o main.o sub.oなど)が存在するかどうかを検出します.
  • は、2番目のバージョンのadd.o:add.c gcc add.c-cのような次のルールを下に検索し、2番目のバージョンのadd.o main.o sub.oのような検索依存を生成するためのルールがある場合、ルールのコマンドを実行します.

  • 依存が存在し、更新が必要かどうかを判断します.
  • 原則:ターゲットの時間>依存する時間.逆に更新します.(2番目のバージョンでvim add.cのようにadd.cファイルに空の行を1つ追加!makeではadd.cのみをコンパイル)

  • の2番目のバージョンの欠点:makefileファイルには冗長なコンテンツがたくさんあります.
  • の具体的な例は以下の通りであり、第3のバージョン:
  • カスタム変数:obj=a.o b.o c.0
  • 変数の値:aa=$(obj)
  • makefileに付属する変数:大文字
  • CPPFLAGS
  • CC

  • 自動変数:自動変数はルールのコマンドでのみ使用できます!
  • $@:ルール内のターゲット
  • $
  • $^:ルール内のすべての依存
  • dl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile 
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile 
    obj = add.o main.o sub.o
    target = app
    $(target):$(obj)
        gcc $(obj) -o $(target)
    #  
        gcc $^ -o $@
    
    %.o:%.c
        gcc -c $< -o $@ 
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ rm *.o
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make
    cc    -c -o add.o add.c
    cc    -c -o main.o main.c
    cc    -c -o sub.o sub.c
    gcc add.o main.o sub.o -o app
    
  • パターンマッチング:.o:%.c
  • 初回:add.o
  • なし
    add.o:add.c
        gcc -c add.c -o add.o
    
  • 2 2 2回目:main.o
  • なし
    main.o:main.c
        gcc -c main.c -o main.o
    

    5.makefileの関数

  • の3番目のバージョンの欠点:移植性が悪い.
  • の具体的な例は以下の通りであり、第4のバージョン:
  • makefileのすべての関数は、戻り値
  • である.
  • wildcard指定ディレクトリの下にある指定されたタイプのファイル(例./.c):src=$(wildcard./.c)
  • マッチング置換:obj=$(patsubst%.c,%.o,$(src))
  • cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ vim makefile 
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile 
    src = $(wildcard ./*.c)
    obj = $(patsubst %..c, %..o, $(src))
    target = app
    $(target):$(obj)
        gcc $^ -o $@
    
    %..o:%..c
        gcc -c $< -o $@ 
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ make
    gcc mul.c main.c add.c sub.c -o app
    cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ ./app
    sum=36
    

    6.makefileにプロジェクトクリーンアップ機能を追加

  • の4番目のバージョンの欠点:プロジェクトをクリーンアップできません.
  • の具体的な例は、次のとおりです.5番目のバージョンです.
  • makeに究極のターゲットではないターゲットを生成させる:makeターゲット名
  • クリーンアッププロジェクトのルールを記述する:
  • clean:
        rm *.o app
    
  • 宣言ダミーターゲット:
  • .PHONY:clean
    
  • -f:強制実行
  • コマンドの前に-:実行に失敗したコマンドを無視して、残りのコマンドを下に実行し続けます.
  • cdl@cdl-Inspiron-5421:~/Cpp_Tutorials/Makefile$ cat makefile 
    src = $(wildcard ./*.c)
    obj = $(patsubst %..c, %..o, $(src))
    target = app
    $(target):$(obj)
        gcc $^ -o $@
    
    %..o:%..c
        gcc -c $< -o $@ 
    .PHONY:clean
    clean:
        -mkdir /abc 
        -rm  $(obj) $(target) -f