記事ディレクトリ
1. make/makefile の紹介
1. メイク、メイクファイルとは?
make
C++ プロジェクトを構築するためのツール/コマンドmakefile
であり、コンパイル コマンドを含むスクリプトファイルです。make ツールを使用して makefile 内のコマンドを解釈し、プロジェクトをコンパイルします。
2. make/makefile があるのはなぜですか?
Linux環境で開発した場合、プロジェクトのソースファイルが少ない場合はgccで直接コンパイルできますが、プロジェクトのソースファイルが多い場合、gccの直接コンパイルは複雑です(コマンドが多い、ファイルをコンパイルする順番が違うなど)。そのため、make/makefile を使用して自動コンパイルを実現することは、プロジェクト開発に有益です。
2. Makefile のルール
1.基本ルール
target:prerequisites
command
Makefile ファイルの基本的なルールの記述:
おいしい料理を作るのと同じように、頼りになる食材が必要で、シェフの優れた調理技術に頼らなければなりません。
- ターゲット: ターゲット。生成されるターゲット ファイルは、多くの場合、test.i、test.s、test.o、test など、プログラムの中間ファイルまたは最終ファイルです。
- 依存関係: 前提条件、ターゲット ファイルが生成されるファイル、多くの場合 1 つ以上
- コマンド: コマンド、このコマンドを実行して依存ファイルからターゲット ファイルを取得する場合、
[tab键]
コマンドの前に 1 つある必要があり、複数のコマンドが存在する可能性がありますが、各コマンドは 1 行である必要があることに注意してください。
メイクファイルでは、[tab键]
省略できず、スペースで置き換えることもできません. [タブ キー] は 4 つのスペースまたは 8 つのスペースと等しくありません. タブ キーは実際には 4 文字ですが、4 文字を表します.
2.例を挙げる
Makefile は次のとおりです。
PS:
- メイクファイルのファイル名は、次のように呼び出すこともできます。
Makefile
- makefile ファイル内のコメントは "
#
"を使用します
test:test.c #依赖关系
gcc test.c -o test #依赖方法
.PHONY:clean
clean:
rm -rf test
- この .PHOINY とは何ですか? 後で説明します
:wq! vim を終了した後、makefile をどのように使用しますか?
3. 偽のターゲット
偽のターゲットを紹介する前に、実際のターゲットの概念について話しましょう。
実際のターゲット: 実際のターゲットは、コマンドの
test
実行後に生成されるファイル名です疑似ターゲット: コマンドの実行後、実際のファイルは生成されません. 補助操作によく使用されます. .PHONY は疑似ターゲットのラベルです. これ
clean
は疑似ターゲットであり、実際に名前が付けられたファイルを生成しません綺麗。疑似ターゲットの特徴:疑似ターゲットはいつでも実行できる[なぜ後で]
4. その他のルール
変数名 | 意味 |
---|---|
$@ |
テストを表すことができるターゲット ファイル |
$^ |
すべての依存ファイルは test.c を表すことができます |
$< |
最初の依存ファイル |
test:test.c
@gcc $^ -o $@
.PHONY:clean
clean:
@rm -rf test
@: コマンドラインで @ なしで make を実行すると、実行されたコマンドは端末にエコーされ、@ はエコーされません。
コマンド ラインを実行すると、依存関係と依存メソッドの最初のセットを実行するコマンドは make であるのに、依存関係と依存メソッドの 2 番目のセットを実行するコマンドは make clean になるのはなぜですか?
実際、最初に依存関係の最初のセットにデフォルト設定し、依存メソッドも完全に記述することができます: make test
最初のグループは test を省略して make のみを記述できると規定しているだけです。
3. ファイルの 3 つの時間の問題 - プログラムの作成
1. 3 回の更新はいつですか
ファイル = ファイルの内容 + ファイルの属性
stat + ファイル名でファイルのステータスを表示できます。
[li@VM-8-5-centos 1-7]$ stat test.c
File: ‘test.c’
Size: 74 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 924282 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1002/ li) Gid: ( 1002/ li)
Access: 2023-01-07 18:48:21.189648157 +0800
Modify: 2023-01-07 18:48:17.476581743 +0800
Change: 2023-01-07 18:48:17.476581743 +0800
Birth: -
時間 | 意味 |
---|---|
アクセス(ファイルアクセス時間) | cat/less など、ファイル読み込み時に変化しますが、ls はファイル閲覧時の時刻を更新しません。 |
Modify (ファイル変更時刻) | vim/touchなどファイル内容を編集すると変化する |
変更(属性変更時間) | mv/chmod など、ファイル属性を変更すると変化します。 |
ファイルの内容の変更を完了するにはファイルにアクセスする必要があるため、更新を変更すると、Access も更新する必要があります。
ファイルの内容が変更されるため、ファイル サイズが変更される必要があるため、Modify の更新、Change も更新する必要があります。
ただし、Access/Change を変更しても、残りの 2 回は変更されません。
ファイル属性を確認します。
Linux ファイルまたはディレクトリの属性には、主に、ノード、タイプ、許可モード、リンク数、ファイルまたはディレクトリが属するユーザーおよびユーザー グループ、ファイルまたはディレクトリ。
-rw-rw-r-- 1 li li 62 Jan 7 18:47 Makefile
-rwxrwxr-x 1 li li 8360 Jan 7 20:55 test
-rw-rw-r-- 1 li li 74 Jan 7 18:48 test.c
2.タッチの2つの機能
touch コマンドでファイルを作成できることはわかっていますが、もう 1 つの機能は、既存のファイルの 3 回分をシステム時刻として更新することです。
touch test//不带选项,atime,mtime,ctime都更新
touch test -a//atime更新
touch test -m//mtime更新
touch test -c//ctime更新
3. make プログラムは、依存ファイルが更新されているかどうかをどのように認識しますか?
最初に test.c があり、次にテスト ファイルが存在する必要があります。つまり、最初は、test.c の変更時刻が test の変更時刻よりも古い必要があります。
make プログラムが、test の最終変更時刻が実際には test.c の最終変更時刻よりも古いことを検出した場合、test.c は test の最終変更後に変更されている必要があることを意味します。実行されると成功し、逆もまた同様です。
ここで.PHONY
、.PHONY によって変更されたものは常に実行できるという特徴があることも説明できます。つまり、.PHONY の変更後、テストの変更時間とtest.c!