最小のメイクファイル

素材mrbook.org/tutorials/makeの厳密な翻訳ではありませんでしたかつて、makeに関する基本的なことを理解するのに十分なトレーニングマニュアルがありませんでした。 少なくとも誰にとっても面白いと思います。 この技術は死にかけていますが、それでも多くのプロジェクトで使用されています。 「Transfers」ハブには十分なカルマがありませんでした。機会があればすぐに-私もそこに追加します。 翻訳に追加されました。 設計に誤りがある場合は、それらを示してください。 修正します。

この記事は、主にIDEを使用せずに、非常に根本からUNIXライクなシステムでC / C ++プログラミングを勉強している人にとって興味深いものになります。

特に複数のソースファイルがある場合、ペンでプロジェクトをコンパイルするのは退屈な作業であり、それぞれに対してコンパイルとリンクコマンドを毎回入力する必要があります。 しかし、すべてがそれほど悪いわけではありません。 ここで、メイクファイルを作成して使用する方法を学びます。 メイクファイルは、ワンタッチでソフトウェアプロジェクトを構築するのに役立つメイクプログラムの指示のセットです。

実際には、1つのディレクトリ内の4つのファイルからHello Worldに似た顕微鏡プロジェクトを作成する必要があります。
main.cpp
#include <iostream> #include "functions.h" using namespace std; int main(){ print_hello(); cout << endl; cout << "The factorial of 5 is " << factorial(5) << endl; return 0; } 


hello.cpp
 #include <iostream> #include "functions.h" using namespace std; void print_hello(){ cout << "Hello World!"; } 


factorial.cpp
 #include "functions.h" int factorial(int n){ if(n!=1){ return(n * factorial(n-1)); } else return 1; } 


functions.h
 void print_hello(); int factorial(int n); 


一括ですべてをここからダウンロードできます。
著者は、知る必要のないC ++言語と、gccのg ++​​コンパイラを使用しました。 他のどのコンパイラも同じことをする可能性があります。 ファイルが少し調整されたため、gcc 4.7.1ビルド

プログラムを作る

実行する場合
make
その後、プログラムは現在のディレクトリでデフォルト名のMakefileファイルを見つけようとし、そこからの指示に従います。 現在のディレクトリに複数のメイクファイルがある場合は、次の方法で目的のメイクファイルを指定できます。
make -f MyMakefile
他の多くのパラメーターは、今のところ必要ありません。 それらについては、manページで確認できます。

組立工程

コンパイラはソースコードファイルを取得し、そこからオブジェクトファイルを取得します。 その後、リンカーはオブジェクトファイルを取得し、それらから実行可能ファイルを取得します。 アセンブリ=コンパイル+リンク。

ハンド編集

プログラムを構築する最も簡単な方法:
g++ main.cpp hello.cpp factorial.cpp -o hello
入力するたびに不便なので、自動化します。

最も簡単なメイクファイル

次の部分を含める必要があります。
 :  [tab]  

この例では、メイクファイルは次のようになります。
 all: g++ main.cpp hello.cpp factorial.cpp -o hello 

コマンドを含む行はタブで始まることに注意してください! これをプロジェクトのあるディレクトリにMakefile-1という名前で保存し、コマンドmake -f Makefile-1ビルドを開始します。
最初の例では、ターゲットはallと呼ばれall 。 これはmakefileのデフォルトのターゲットであり、他のターゲットが明示的に指定されていない場合に実行されます。 また、この例では、この目的のために依存関係がないため、makeはすぐに必要なコマンドの実行を開始します。 次に、チームはコンパイラを起動します。

依存関係の使用

1つのmakefileで複数のターゲットを使用すると、大規模なプロジェクトに役立ちます。 これは、1つのファイルを変更するときに、プロジェクト全体を再構築する必要はありませんが、変更された部分のみを再構築することなく実行できるという事実によるものです。 例:
 all: hello hello: main.o factorial.o hello.o g++ main.o factorial.o hello.o -o hello main.o: main.cpp g++ -c main.cpp factorial.o: factorial.cpp g++ -c factorial.cpp hello.o: hello.cpp g++ -c hello.cpp clean: rm -rf *.o hello 

これは、 Makefile-2という名前ですべて同じディレクトリに保存する必要があります

現在、 allは依存関係のみがあり、コマンドはありません。 この場合、makeは呼び出し時に、この目的のためにファイルで指定されたすべての依存関係を順番に実行します。
新しいcleanターゲットも追加されました。 従来は、すべてのプロジェクトアセンブリ結果の迅速なクリーニングに使用されていました。 クリーニングは次のように始まりますmake -f Makefile-2 clean

変数とコメントを使用する

変数は、メイクファイルで広く使用されています。 たとえば、これは、プロジェクトが別のコンパイラまたは他のオプションでアセンブルされる可能性を考慮する便利な方法です。
 #  ,  ,   CC  ,    CC=g++ #   .  ,    CFLAGS  ,    CFLAGS=-c -Wall all: hello hello: main.o factorial.o hello.o $(CC) main.o factorial.o hello.o -o hello main.o: main.cpp $(CC) $(CFLAGS) main.cpp factorial.o: factorial.cpp $(CC) $(CFLAGS) factorial.cpp hello.o: hello.cpp $(CC) $(CFLAGS) hello.cpp clean: rm -rf *.o hello 

これはMakefile-3
変数は非常に便利なものです。 それらを使用するには、それらが使用されるまで値を割り当てる必要があります。 その後、次のように適切な場所で値を置き換えることができます: $(VAR)

次にすること

この簡単な説明の後、簡単なメイクファイルを自分で作成してみてください。 次に、真面目な教科書やマニュアルを読む必要があります。 最後のコードとして、ほとんどすべてのプロジェクトに2回タッチするだけで適応できるユニバーサルメイクファイルを独立して分解して実現することができます。
 CC=g++ CFLAGS=-c -Wall LDFLAGS= SOURCES=main.cpp hello.cpp factorial.cpp OBJECTS=$(SOURCES:.cpp=.o) EXECUTABLE=hello all: $(SOURCES) $(EXECUTABLE) $(EXECUTABLE): $(OBJECTS) $(CC) $(LDFLAGS) $(OBJECTS) -o $@ .cpp.o: $(CC) $(CFLAGS) $< -o $@ 

Makefile-4
頑張って!

Source: https://habr.com/ru/post/J155201/


All Articles