初探makefile

2577 ワード

恥ずかしいことに、プログラム猿を自慢して、最近makefileに触れて、記録して、第一歩を売った.
前にcコードを书いて、ずっと各种のIDEを使って、VSからXCODEまで、ずっと马鹿なボタンでコンパイルして、最近まで、やっといくつかのコードをSOファイルにコンパイルするため、やっと初めてmakefileに接触して、1枚の新しい扉を开きました.
参考になるブログ:
https://www.cnblogs.com/wang_yb/p/3990952.html
https://blog.csdn.net/dongdong0071/article/details/52040559

一、makefileの概要


はっきり言ってmakefileは一連のshellコマンドを1つのファイルに書き、makeコマンドによって実行し、示す.c .hファイル間の相互依存関係は,gcc(g++)を用いてプロジェクトをコンパイルする.その役割は、プロジェクト内の多くのファイルを管理し、相互の依存関係を処理し、コンパイルを容易にすることです.

1.1 makefile基本フォーマット

target ... : prerequisites ...
    command
    ...
    ...

次のようになります.
  • target-ターゲットファイル、Object Fileでも実行可能ファイル
  • でもよい.
  • prerequisites-targetを生成するために必要なファイルまたはターゲット
  • command-make実行する必要があるコマンド(任意のshellコマンド)、Makefileのコマンドは[tab]で始まる
  • でなければなりません.

    1.2 GNU makeの働き方

  • マスタMakefile(マスタMakefileで他のMakefileを参照可能)
  • を読み込む.
  • includeの他のMakefile
  • を読み込む
  • 初期化ファイルの変数
  • 暗黙のルールを導き、すべてのルール
  • を分析する.
  • すべてのターゲットファイルの依存関係チェーン
  • を作成
  • 依存関係に基づいて、どのターゲットが
  • を再生成するかを決定する.
  • 生成コマンド
  • を実行する.

    二、簡単な例


    makefileは大規模なエンジニアリングのコンパイルに使用できますが、本人のレベルが限られているため、複雑すぎてはっきり言えないのではないかと心配しています.本稿では、入門レベルの例だけを紹介します.
    // Hello world, :
    1. print.h
    #include
    void printhello();
    
    2. print.c     
    #include"print.h"
    void printhello()
    {
        printf("Hello, world
    "); } 3. main.c #include "print.h" int main(void) { printhello(); return 0; }

    これらのコードをコンパイルするには、対応するmakefileは次のとおりです.
    helloworld : main.o print.o #helloword  
                     # main.o print.o 
          gcc -o helloworld main.o print.o#shell , tab 
    
        mian.o : mian.c print.h
          gcc -c main.c
        print.o : print.c print.h
          gcc -c print.c
        
        clean :          
            rm helloworld main.o print.o
    

    makeを入力するとgccコンパイルが呼び出され、make cleanを入力するとhellowworld mianが削除されます.o print.o.
    makefileコードから論理がはっきりしていることがわかります.
  • helloworldを生成するプログラムにはmainが必要です.oとprint.o 2ファイル
  • main.oの生成にはmainが必要である.cとprint.h
  • print.oの生成にはprintが必要である.cとprint.h

  • 以上がmakefileファイルの作成の論理的考え方であり、実際の作成では、コードを簡略化するために使用できる文法がたくさんあります.例えば、上記のコードは以下のように簡略化できます.
    objects =  main.o print.o # 
    
        helloworld : $(objects) // $() 
          gcc -o helloworld$(objects)
         mian.o : mian.c print.h
          gcc -c main.c
        print.o : print.c print.h
          gcc -c print.c
        
        clean :          
            rm helloworld $(objects)

    もっと多くの文法は、この文では詳しく説明しません.
    不当な点は,皆さんのご叱正を請う.