【Linux】make/Makefile&プログレスバーアプレット

目次

1. make/makefile について理解する

2. コード例

1. 依存関係

2. 原則

3. プロジェクトのクリーンアップ

4. テストの説明

3. Linux初の小さなプログラム - プログレスバー

ゲーム.h

ゲーム.c

test.c

詳しい手順の説明


 

1. make/makefile について理解する

Makefile を作成できるかどうかは、その人に大規模なプロジェクトを完了する能力があるかどうかを一面的に示します。

プロジェクト内のソース ファイルはカウントされません。ソース ファイルは、タイプ、機能、モジュールに応じて複数のディレクトリに配置されます。メイクファイルは、どのファイルを最初にコンパイルする必要があるか、どのファイルを後でコンパイルする必要があるかを指定する一連のルールを定義します。コンパイルし、さらに複雑な機能操作を実行することもできます。

makefile のメリットは「コンパイルの自動化」で、一度作成すれば make コマンドを 1 回実行するだけで、プロジェクト全体が完全に自動でコンパイルされるため、ソフトウェア開発の効率が大幅に向上します。

Make は、makefile 内の命令を解釈するコマンド ツールです。一般的に、Delphi の make、Visual C++ の nmake、Linux 上の GNU の make など、ほとんどの IDE にこのコマンドがあります。 Makefile がエンジニアリングにおけるコンパイル方法になっていることがわかります。

Make はコマンド、makefile はファイルであり、これらを組み合わせて使用​​すると、プロジェクトの自動構築が完了します。

2. コード例

一般に、次のような実行可能プログラムを作成します。

今日では、make/makefile を使用して実装します。

作成されるファイルの名前は、makefile の最初の文字である必要があり、大文字または小文字を使用できます。

このように make コマンドを直接入力すると、実行可能ファイルが自動的に作成され、非常に便利です。

1. 依存関係

上記のファイル mybin (game.o に依存)

game.o 、これは game.s に依存します

game.s 、これは game.i に依存します

game.i 、これは game.c に依存します

2. 原則

デフォルトの方法では、make はどのように動作しますか。つまり、make コマンドを入力するだけです。それで

1. make は、現在のディレクトリで「Makefile」または「makefile」という名前のファイルを探します。

2,見つかった場合は、ファイル内の最初のターゲット ファイル (ターゲット) が見つかります。上記の例では、「mybin」このファイルを作成し、このファイルを最終ターゲット ファイルとして使用します。

3、mybinファイルが存在しない場合、または mybin が依存する後続の game.o ファイルのファイル変更時間が よりも長くなっています。 mybinこのファイルは新しいものです (タッチ を使用してテストできます)、実行されますファイル mybin を生成するための後でコマンドで定義されるもの。

4、場合こんにちはゲームに依存します.o ファイルが存在しない場合、make は現在のファイル内でターゲットを < として検索します。 a i= 8>game.o ファイルの依存関係。見つかった場合、game.o ファイルはそのルールに従って生成されます。 (これはスタック プロセスに少し似ています) 依存する game.o ファイルが存在しない場合、 makemake a> は、ターゲット ファイル game.o 現在のファイル内にあります。見つかった場合は、そのルールに従って生成されます。game.o ファイル。 (これはスタックプロセスに少し似ています)

5,当然,你的C文件和H文件是存在的啦,于是make会生成game.o 文件,然后再用 game.o 文件声明 make的终极任务,也就是执行文件mybin了。

6、これは、make は、最初のターゲット ファイルが最終的にコンパイルされるまで、ファイルの依存関係をレイヤーごとに検索します。

7,検索プロセス中に、最後の依存ファイルが見つからないなどのエラーが発生した場合、make はまったく機能しません。 。 理由。 make は直接終了してエラーを報告します。ただし、定義されたコマンドのエラーやコンパイルの失敗の場合、

8, make はファイルの依存関係のみを考慮します。つまり、依存関係が見つかった後もコロンの後のファイルが存在しない場合は、申し訳ありませんが勝ちました。働かないよ。

3. プロジェクトのクリーンアップ

プロジェクトをクリーンアップする必要がある

clean と同様、最初のターゲット ファイルに直接的または間接的に関連付けられていない場合、その後に定義されたコマンドは自動的に実行されませんが、make が実行されることを示すことができます。つまり、「make clean」コマンドは、再コンパイルのためにすべてのターゲット ファイルをクリアするために使用されます。

ただし、クリーンなターゲット ファイルの場合は、通常、それを擬似ターゲットとして設定し、.PHONY で変更します。擬似ターゲットの特徴は、常に実行されることです。

mybin ターゲット ファイルを疑似ターゲットとして宣言し、テストできます。

4. テストの説明

上記はすべて草の根レベルの原則ですが、深く学ぶのに適した言葉はたくさんあります。

mybin: game.c は依存関係であり、mybin は game.c によって形成される実行可能ファイルですが、具体的にはメソッドによって実装方法が異なります。 gcc game.c -o mybin は依存関係メソッドです。

また、 gcc game.c -o mybin は gcc -o $@ $^; と書くこともできます。

$@ は mybin を意味し、$^ は game.c を意味します

同じ効果があり、より便利なので、後者の使用をお勧めします。

.PHONY はファイルを擬似ファイルに変更することを意味し、擬似ファイルの特徴は常に実行されることです。

プログラムが常に実行されてクリーンになるように、下に clean を置くのが最善です。

常に make を実行する場合、mybin の変更時間は game.c の変更時間よりも遅いため、後者は無効になります。

上に引いた赤線が修正時間で、Mybin は game.c よりも遅いため、make は実行されません。

game.c ファイルを変更して見てみましょう。

修正が完了したところですが、game.c の時間は mybin の時間よりも遅くなります。

make を実行できるようになりますが、再度開くと、mybin ファイルの変更時間が game.c の変更時間よりも長くなり、make は実行されません。

タッチを使用してファイルの変更時刻を更新することもできます。

mybin ターゲット ファイルを疑似ターゲットとして宣言した場合は、それをテストします。

このように、毎回 make が実行されることになりますが、それ自体は正しいので使用することはお勧めしません。変更せずに実行しないでください。何も問題はありません。今、ファイルは小さいので、問題はありません。ファイルが非常に大きい場合、毎回実行すると非常に時間がかかります。

clean はファイルをクリーンアップするために使用されます。使用した場合は make clean になります。

ワンクリックでファイルを直接クリーンアップします。

ああ、ところで、もう 1 つ使用するものがあります: make ですが、なぜ clean ではなく mybin を実行するのでしょうか?

make コマンドは上から下に実行されます。

順番に置き換えてください。

次に、make を実行すると clean が実行され、make mybin を実行すると実行可能ファイル mybin が作成されます。これは上から下への順序であり、順序は影響しません。

3. Linux初の小さなプログラム - プログレスバー

兄弟たちは一生懸命働き始めました。

まず最初に必要な書類を準備します。

ゲーム.h

#include<stdio.h>
#include<time.h>
#include<unistd.h>

void game(double rate);
void download();

ゲーム.c

#include"game.h"
#define MAX 1024*1024*1024

char* buff = "|/-\\";
int i = 0;
char arr[102] = { 0 };
void game(double rate)
{
	if (rate <= 1.0)
	{
		arr[0] = '=';
	}
	printf("[%-100s][%.1lf%%][%c]\r", arr, rate, buff[i % 4]);
	fflush(stdout);
	arr[(int)rate] = '=';
	if (rate< 99.0)
	{
		arr[(int)rate+1] = '>';
	}
	i++;
}

void download()
{
	srand(time(NULL)^1023);
	int max = MAX;
	int cnt = 0;
	double rate = 0;
	while (rate<100.0)
	{
		cnt+= rand() % (1024*1024);
		rate = ((cnt*1.0)/max)* 100;
		if (rate > 100)
		{
			rate = 100;
		}
		game(rate);
		usleep(50000);
	}
}

test.c

#include"game.h"

int main()
{
	download();
	return 0;
}

詳しい手順の説明

このプログラムはメモリ プログレス バーを作成します。MAX をダウンロードする必要のあるメモリ サイズとし、cnt をダウンロードした部分、rate をダウンロードした割合とし、それをゲーム関数に渡してプログレス バーを実行します。 , rete によると、サイズは等号と同様にパーセンテージとして出力され、プログラムがスタックしているかどうかを判断するための反転された配列もあります。その後、等号の後に > を追加して 100% まで出力を装飾します。プログラムを終了します。

おすすめ

転載: blog.csdn.net/m0_71676870/article/details/134463213