gcc同時コンパイル複数ファイル(makefileツールの学習)
5171 ワード
目次
makefileツール
エンジニアリングマネージャとは、その名の通り、多くのファイルを管理することを意味し、Makeエンジニアリングマネージャは「自動コンパイルマネージャ」であり、ここでの「自動」とは、ファイルタイムスタンプに基づいて更新されたファイルを自動的に発見し、コンパイルの作業量を減らすことができると同時に、Makefileファイルの内容を読み込むことで大量のコンパイル作業を実行し、Makeは変更されたコードファイルのみをコンパイルし、完全にコンパイルする必要はありません.
makefileツールの実行
makefileツールはLinuxのmakeコンパイルコマンドに基づいて存在する.次に、makefileファイルの実行手順について説明します.1、makeは現在のディレクトリの下で「Makefile」または「makefile」という名前のファイルを探します.
2、見つかった場合、ファイルの最初のターゲットファイル(target)を探します.次の例では、「test」というファイルを見つけ、このファイルを最終的なターゲットファイルとします.
3、mainファイルが存在しない場合、またはmainが依存する後の.oファイルのファイル修正時間がmainというファイルよりも新しい場合、後で定義したコマンドを実行してmainというファイルを生成します.
4、mainが依存する場合.oファイルも存在しない場合、makeは現在のファイルでターゲットを探します.oファイルの依存性は,見つかったらそのルールに従って生成する.oファイル.(これはスタックのプロセスに似ています)
5、もちろん、あなたのcファイルとhファイルは存在します.するとmakeが生成します.oファイル、それから使います.oファイル生命makeの究極のタスクは、ファイルmainを実行することです.
PS:make全体の依存性、makeは最終的に最初のターゲットファイルがコンパイルされるまで、ファイルの依存関係を次々と探します.検索中に、最後に依存するファイルが見つからないなどのエラーが発生すると、makeは直接終了し、エラーを報告しますが、定義されたコマンドのエラー、またはコンパイルが成功しない場合は、makeはまったく相手にしません.makeはファイルの依存性にかかわらず、つまり私が依存関係を探した後も、コロンの後ろのファイルがいなければ、仕事をしません.
構文規則
1、ファイルは含む:文法:includeファイル名
役割:他のmakefileファイルを含め、より大きなmakefileファイルを構成することで、makefileのモジュール化プログラミングに役立ちます.通常、いくつかの構成オプションを独立したmakefileファイルに分割します.これにより、makefileファイルの管理が容易になります.また、モジュールコードの依存関係とコンパイルが必要なファイル情報を独自にmakefileファイルに書き、最終的にincludeコマンドで最上位のmakefileファイルを形成することで、エンジニアリングコード全体のコンパイルとリンクを完了します.
2、変数定義makefileでは、常に変数を定義してから、その変数に新しい値を追加します(+=記号など).例えば、C_を定義します.SRCS変数(この値は空でもよい)は、コードファイルtest 1を生成する.cとtest 2.c C_に追加SRCSでは、そのコードは以下の通りです:C_SRCS :=
C_SRCS += test1.c test2.c
makefileには、自動変数という特殊な変数があります.自動変数の値は、ルールのtargetとprerequisites(前提条件)に基づいて自動的に計算されます.自動変数は一般的に先頭$から始まります.次に、一般的な自動変数をリストします.
(1)$@はルール内のtarget名です.
(2)$<ルール内の最初のprerequisite名
3、ルール定義:ルールはmakefileの中で最も重要な概念であり、makeターゲットファイルの依存関係、およびこれらのターゲットファイルの生成と更新方法を教える.makefileファイルルールには2種類あり、1つは明示的ルール、もう1つは暗黙的ルールです.
(1)明示的なルールは、ターゲットが依存するファイル情報をリストし、コマンドを呼び出してターゲットを作成または更新するときと、ターゲットを再生成する方法を説明するために使用されます.一般的にtargets:prerequisites
recipe …
targetsは生成または更新するターゲットであり、prerequisitesはターゲット依存関係であり、recipeは生成ターゲットのコマンドであり、1つのルールにはfooなどの複数のrecipeがある.o : foo.c defs.h
cc -c -g foo.c
そのうちfoo.oはtarget,foo.c defs.hはprerequisites,cc-c-g fooである.cはrecipeです.
(2)暗黙的なルールは、ターゲットが類似した名前のファイルにどのように依存するかを記述し(一般的には接尾辞情報を除去し、ターゲットが依存ファイルの名前と同じである)、ターゲットを作成または更新するために命令を呼び出すターゲットファイルの再生成方法を説明するために使用される.
4、ファイル検索パスの設定
Makeコマンドのデフォルトでは、現在のパスでprerequisitesのファイル(ヘッダファイルなど)が検索されますが、プログラムを書くときにヘッダファイルとソースファイルを異なるフォルダの下に隔てることがよくあります.これはどうすればいいですか?
1、VCATH変数で解決できます.2、vpath命令で解決できます.
(1)VCATH変数
VCATH変数は、すべてのprerequisitesに対してファイルパスを指定します.パス間は、次のようにスペースで区切ることができます.たとえば、
VPATH = src:…/headers
(2)vpath指令
vpath命令の作用は変数VCATHの作用とあまり差がないが、vpathはより柔軟性があり、その文法は以下の通りである.
vpath pattern directories
pattern ,directories , :
vpath %.h ../headers
headers .h 。
インスタンスの学習
上のmakefileの作成の知識を勉強した後、簡単なmakefileファイルを書いて、私の複数のファイルのコンパイルを実現します.次のようになります.
test:main.o channle.o
gcc main.o channle.o -o test
main.o:main.c function.h
gcc -c main.c -o main.o
channle.o:channle.c WavHead.h
gcc -c channle.c -o channle.o -std=c99
.PHONY:clean
clean:
-rm -rf *.o
実行するプロセスは簡単に言えば、最終的にtestというファイルを生成する必要があります.このファイルにはmainが必要です.oとchannle.oは、次に実行する、コマンドgcc-c mainを通過する.c -o main.oメールをもらいました.oファイル、同じ理屈でchannleを手に入れます.oファイルは、最後にgcc mainをコマンドする.o channle.o-o testをリンクすると、最終的にtestという実行可能なファイルが得られます.
上のコードはlinuxのコマンドウィンドウの下にmakeコマンドを入力すると実行でき、最終的にtestの実行可能ファイルが生成されます.生成する中間をクリアする必要がある場合.oファイルは、make cleanを入力するとすべてクリアできます.
PS:(.PHONY)はダミーターゲットマークで、ダミーターゲットマーク後のコマンドは、ディレクトリの下のファイルと重複しません.つまりcleanはダミーターゲットマークがなければ、ディレクトリの下にあるcleanのファイルmake cleanは正しく実行されません!
参考記事:参考1参考2