Ubuntuエントリ(3)GCCコンパイラMakefileベースのShallプログラミング

1.GCCコンパイラ

1.1。VIM設定

  1. ファイル/ etc / vim / vimrcをviで開き、TABキーを4つのスペースに設定します。setts = 4
  2. 表示行番号を設定します。setnu。
  3. "Esc" + ":" + "q保存して終了します。

1.2。コンパイルされたコード

gccのバージョンを確認してください:gcc -v。
コンパイルコマンド:gcc xxx.c -o xxx
主なオプション:
ここに画像の説明を挿入
コンパイルプロセス:前処理、コンパイル、アセンブリ、リンク。前処理とは、すべてのヘッダーファイルを展開し、プログラム内のマクロを置き換え、条件付きコンパイルを解析してファイルに追加することです。コンパイルとは、事前にコンパイルされたコードをアセンブリコードにコンパイルすることです。これは、プログラムのコンパイルについてよく言うことです。アセンブリとは、アセンブリ言語ファイルをバイナリオブジェクトファイルにコンパイルすることです。リンク
とは、コンパイルされた複数のバイナリターゲットをリンクして、最終的な実行可能ファイルを形成することです。リンクには、静的ライブラリと動的ライブラリも含まれます。gccコマンドを使用すると、最初にcファイルを.oファイルにコンパイルしてからリンクすることなく、実行可能ファイルを生成できます。

2. Makefileの基本

2.1。実験手順

実験には5つのファイルがあります:main.c、input.c、calcu.c、input.h、calcu.h。

//main.c
#include <stdio.h>
#include "input.h"
#include "calcu.h"
int main(int argc, char *argv[])
{
	int a, b, num;
	input_int(&a, &b);
	num = calcu(a, b);
	printf("%d + %d = %d\r\n", a, b, num);
}
//input.c
#include <stdio.h>
#include "input.h"
void input_int(int *a, int *b)
{
	printf("input two num:");
	scanf("%d %d", a, b);
	printf("\r\n");
}
//calcu.c
#include "calcu.h"
int calcu(int a, int b)
{
	return (a + b);
}
//input.h
#ifndef _INPUT_H
#define _INPUT_H
void input_int(int *a, int *b);
#endif
//calcu.h
#ifndef _CALCU_H
#define _CALCU_H
int calcu(int a, int b);
#endif

実験の機能は、キーボードから入力された2つの数値を取得し、それらの合計を出力することです。input_int関数のパラメーターは、int型の2つのポインター変数です。呼び出す場合、int型の2つの数値を定義する必要があり、それらのアドレスが関数の入力パラメーターとして使用されます。コマンド「gcc main.c calcu.c input.c -o main」を入力してコンパイルおよびリンクし、次に「./main」を使用して実行しますが、欠点はgccコマンドがすべてのcファイル名を入力して1つを変更する必要があることですすべてのファイルを再コンパイルする必要があります。

2.2。Makefileの概念と基本的な操作手順

Makefile特性:

  1. プロジェクトがコンパイルされていない場合は、プロジェクト内のすべての.cファイルをコンパイルして、実行可能プログラムにリンクする必要があります。
  2. プロジェクトでいくつかのCファイルのみが変更されている場合は、変更されたCファイルのみをコンパイルします。
  3. プロジェクトヘッダーファイルが変更された場合、このヘッダーファイルを参照するすべてのCファイルをコンパイルして実行可能ファイルにリンクする必要があります。

操作手順:

  1. プロジェクトディレクトリに「Makefile」という名前のファイルを作成します。
  2. / etc / vim / vimrcを変更します。
    ここに画像の説明を挿入
  3. Makefileファイルを書き込みます。インデントには「Tab」を使用する必要があります。
  4. コマンド「make」を入力して、ファイルをコンパイルおよびリンクします。

2.3。Makefileルールの形式

ルールの形式:
ターゲット...:依存ファイルセット...
コマンド1
コマンド2 ...
makeコマンドは、実行するTABで始まるMakefile内の各コマンドのシェルプロセスを作成します。

Makefileファイルのコンテンツルールの分析:
ここに画像の説明を挿入

  1. ターゲットがデフォルトターゲットになる最初のルールのメインを更新します。デフォルトターゲットが更新されている限り、Makefileの作業は完了していると見なされます。最初のコンパイルではmainがまだ存在しないため、最初のルールが実行されます。最初のルールは、3つのメイン.o、input.o、およびcalcu.oファイルに依存します。現在、.oファイルがないため、最初にこれらの3つのファイルを更新します。makeは、これらの3つの.oファイルを対象とするルールを見つけて実行します。
  2. main.oを例にとると、main.oを更新するのは2番目のルールであるため、2番目のルールが実行されます。2番目のルールのコマンドは「gcc -c main.c」で、main.cをコンパイルします。 main.oを生成します。
  3. 最初のルールが実行されたとき、ターゲットファイルが存在することが判明したとき、またはターゲットが依存するファイルがターゲットファイルよりも新しくない場合(つまり、最終変更時間がターゲットファイルよりも早い場合)、後続のコンパイルコマンドは実行されません。
  4. 最後のルールの目標はクリーンで、依存ファイルがないため、依存ファイルは最新であり、対応するコマンドは実行されません。クリーンを実行したい場合は、「make clean」コマンドを直接使用できます。

2.4。Makefile変数

  1. $(変数名): Makefile内の変数の参照方法は "$(変数名)"です次の図では、変数オブジェクトを割り当てるときに "="を使用しています。
    ここに画像の説明を挿入
  2. **割り当て "=": "="を使用して変数を割り当てる場合、別の変数を使用して、変数の実際の値を後ろに押して定義できます。つまり、変数の実際の値は参照に依存します変数の最後の有効な値。Makefileの出力文字には、Cの「printf」と同じように「echo」を使用し、先頭に「@」を追加すると、コマンド実行プロセスは出力されません。
    ここに画像の説明を挿入
    ここに画像の説明を挿入
  3. 割り当て文字 ":=":後で定義された変数は使用されず、上記で既に定義された変数のみが使用されます。
    ここに画像の説明を挿入
    ここに画像の説明を挿入
  4. 割り当て文字 "?=":変数が以前に割り当てられていない場合、変数は "?="の後の値と同じです。値が以前に割り当てられている場合、前に割り当てられた値が使用されます。
  5. 変数に "+ ="追加します。Makefileの変数は文字列です。以前に定義した変数に文字列を追加する必要がある場合は、 "+ ="を使用する必要があります。

2.5。Makefileモードのルールと自動化変数

形式:%.

o :%.c (タブ)コマンドルールを使用すると、モードルールを使用して、すべての.cファイルを対応する.oファイルにコンパイルできます。ターゲットの「%」はファイル名との一致を示し、「%」は空でない任意の長さの文字列を示します。たとえば、「%.c」は.cで終わるすべてのファイルです。「A.%。C」は、aで始まり、.cで終わるすべてのファイルを意味します。

自動化変数:上記のパターンルールでは、パターンルールが解析されるたびに、それらは異なるターゲットおよび依存ファイルになり、コマンドには1行しかありません。自動化変数を使用して、1行のコマンドでさまざまな依存ファイルから対応するターゲットを生成します。いわゆる自動化変数とは、パターンで定義された一連のファイルを1つずつ自動的に取り出すことです。自動化変数は、ルールのコマンドにのみ表示されます。一般的に使用される自動化変数は次のとおりです:
ここに画像の説明を挿入
ルールモードと自動化変数を使用した、Makefileを次のように変更できます。
ここに画像の説明を挿入

2.6。メイクファイルの条件判定

構文フォーマット:

<条件关键字>
	<条件为真时执行的语句>
endif
//以及
<条件关键字>
	<条件为真时执行的语句>
else
	<条件为假时执行的语句>
endif

4つのキーワード: ifeq、ifneq、ifdef、ifndef。

3.プログラミングをする

3.1。Shallスクリプトの基本

はじめに:シェルスクリプトはプレーンテキストファイルで、1行ずつ実行されます。シェルスクリプトの拡張子は.shで、最初の行は"#!/ Bin / bash"でなければなりません

対話型シェルスクリプト(実験1):
シェルスクリプトを作成して実行すると、権限が不十分であることがわかります。「ls xxx.sh -l」を使用して、スクリプトファイルに実行権限がないことを確認します。chmodコマンドを使用して、スクリプトファイルのすべての権限を開きます。正常に実行できます。
ここに画像の説明を挿入
ここに画像の説明を挿入
シェルスクリプトの数値計算(実験2):シェルはシェーピングのみをサポートし、数値計算は$((式))を使用します。合計の後に等号を追加できないことに注意してください。
ここに画像の説明を挿入
テストコマンド(実験3):

  1. testコマンドは、ファイルが存在するかどうか、および権限とその他の情報を確認するために使用され、ジョブの説明、文字、ファイルの3つの側面でテストできます。
  2. &&コマンド:cmd1 && cmd、cmd2は、cmd1が正しく実行された後でのみ実行できます; cmd1が正しく実行されない場合、cmd2は実行されません。
  3. ||コマンド:cmd1が正しく実行された場合、cmd2は実行されません; cmd1が正しく実行されなかった場合、cmd2が実行されます。

次の例では、ファイル名を入力する必要があります。ファイルが存在する場合は左側に「||」、存在しない場合は右側に「||」の内容を印刷します。
ここに画像の説明を挿入
ここに画像の説明を挿入
デフォルト変数(実験4):
$ 0〜$ n:シェルスクリプトコマンド自体($ 0)を含むシェルスクリプトパラメーターを示します。
$#:#最後のパラメーターのラベルを示します。
$ @:意味$ 1、$ 2、$ 3 ...
ここに画像の説明を挿入
ここに画像の説明を挿入

3.2。スクリプト条件判断と関数とループ

条件判断(実験1):
ここに画像の説明を挿入
ケースステートメント(実験2):
ここに画像の説明を挿入
関数呼び出し(実験3):
ここに画像の説明を挿入
ここに画像の説明を挿入
関数転送パラメーター(実験4):
ここに画像の説明を挿入
ここに画像の説明を挿入
while doループ(実験5):入力が実験にない場合、条件が成立したときにループ「閉じる」はループし続けます。
ここに画像の説明を挿入
ここに画像の説明を挿入
ループが終了するまで(実験6):条件が成立しない場合はループし、条件が成立した場合はループを終了します。
ここに画像の説明を挿入
forループ(実験7):
ここに画像の説明を挿入
ここに画像の説明を挿入
forループ処理データ(実験8):
ここに画像の説明を挿入
ここに画像の説明を挿入

時間厳守アトミック組み込みLinux開発ガイドのリファレンス

元の記事を8件公開 23のよう 2217を訪問

おすすめ

転載: blog.csdn.net/weixin_41898804/article/details/105481134