makefileとcmakeの簡単な使用


個人の小さい駅に訪問することを歓迎して、この文を読みます。http://www.yandong.org/archives/419
メークの簡単使用
これは私が自分で書いたmakefileファイルです。一番簡単なのは一つです。
BSoftInst: BSoftInst.cpp ReadXML.cpp main.cpp ireg.cpp ntreg.cpp SoftwareInst.cpp
	g++ -o BSoftInst BSoftInst.cpp ReadXML.cpp main.cpp ireg.cpp ntreg.cpp SoftwareInst.cpp -Wformat -fpermissive -I/usr/include/libxml2 -L/usr/lib/i386-linux-gnu -lxml2 -lguestfs
1.makefileの書き方は
target ... : prerequisites ...
[Tab]   command
targetは生成したいターゲットファイルです。
prerequisitesはターゲットを生成するために依存するファイルです。
commandコマンドは、最初にtabではなく、一連のスペースが必要です。
2.変数の使用
コンパイルプログラムとコンパイルオプションについては、変数で指定できます。このようにメンテナンスしやすいです。特にあなたのプロジェクトが大きい時には、
もし次のような形に変えられたら
#Which compiler
CC = g++
#Where are include files kept
INCLUDE = .
#Options for development
CFLAGS = -g -Wall -ansi -Wformat -fpermissive -I/usr/include/libxml2 -L/usr/lib/i386-linux-gnu -lxml2 -lguestfs
#Options for release
#CFLAGS = -O -Wall -ansi

BSoftInst: BSoftInst.cpp ReadXML.cpp main.cpp ireg.cpp ntreg.cpp SoftwareInst.cpp
	$(CC)   -o BSoftInst BSoftInst.cpp ReadXML.cpp main.cpp ireg.cpp ntreg.cpp SoftwareInst.cpp 
3.完全な依存関係
前のバージョンは、すべてのcppファイルを羅列しましたが、彼らの間の依存関係ははっきりと羅列されていません。
私は怠けるためですが、書類が多くてはいけません。彼らの関係を次のように羅列したいです。
BSoftInst: BSoftInst.o ReadXML.o main.o ireg.o ntreg.o SoftwareInst.o
	$(CC)   -o $@ BSoftInst.o ReadXML.o main.o ireg.o ntreg.o SoftwareInst.o
BSoftInst.o: BSoftInst.cpp BSoftInst.h ReadXML.h
ReadXML.o: ReadXML.cpp ReadXML.h
main.o: main.cpp  ireg.h BSoftInst.h ReadXML.h
ireg.o: ireg.cpp ireg.h ntreg.h
ntreg.o: ntreg.cpp ntreg.h
SoftwareInst.o: SoftwareInst.cpp SoftwareInst.h
依存関係の後ろにコンパイルコマンドを追加することもできます。
BSoftInst.o: BSoftInst.cpp BSoftInst.h ReadXML.h
     g++ -c BSoftInst.cpp BSoftInst.h ReadXML.h
4.ダミーターゲットの使用
このコンパイルの過程では、大量の仮設ファイルなどが発生します。oファイルは削除したいです。makefileファイルの中にあります。
このように書きます
clean:
	rm -f *.o
この二つの行はmakefileのルールにも合致しています。
タージ+
prerequisites+
command)、その中の依存関係だけです。
prerequisites
ありません。cleanは偽ターゲットと呼ばれる。
「偽の目標」はファイルではなく、ラベルだけです。
「偽の目標」はファイルではないので、makeはその依存関係を生成できません。実行するかどうかを決定します。私たちは
この「目標」を表示地に指定してこそ、有効になります。
コマンドラインにmake cleanを入力すると削除操作が実行されます。
もちろん、「偽の目標」の名前はファイル名と重複してはいけません。
.PHONY : clean
この声明がある限り、
有無を問わず
「clean」
ファイル
実行します
「clean」
この目標は、「make clean」で後のコマンドを実行することができます。
5.標準目標
Makefileの最初のターゲットは、デフォルトのターゲットとして使用されます。このように、ファイルの先頭に擬似ターゲットを宣言します。
all : BSoftInst
このようにmakeを入力すると、make BSoff Instを実行するのに相当します。あなたのmakefileファイルの中にいくつかの目標がある時、とても役に立ちます。makeを入力したいなら、一気に複数の目標をコンパイルする必要があります。
all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o utils.o
cc -o prog1 prog1.o utils.o
prog2 : prog2.o
cc -o prog2 prog2.o
prog3 : prog3.o sort.o utils.o
cc -o prog3 prog3.o sort.o utils.o
6.makefileについては、これだけ知っています。
cmakeの簡単な使用
1.簡単に使う
kdevelop 4は現在cmakeを使っています。cmakeはCMakeLists.txtが必要です。
次は私のkdevelopが生成したCMakeLists.txtファイルです。
CMakeLists.txtはmakefileを書くより簡単です。
project(analysisreg2)

add_executable(analysisreg2 main.cpp ntreg.cpp edlib.cpp)
PROJECT命令の文法は以下の通りです。
PROJECT(projectname[CXX][C][Java])
このコマンドでプロジェクト名を定義し、プロジェクトサポートの言語を指定できます。サポートの言語リストは無視できます。
デフォルトはすべての言語をサポートします。
ADD_EXECUTABLE(anlysis reg 2 main.cpp ntreg.cpp)
このプロジェクトがハローというファイル名の実行可能ファイルを生成することを定義しました。後のパラメータはその依存ソースファイルです。
cmakeはmakefileを生成し、異なるプラットフォームに対して異なるmakefileを生成する。
2.変数の使用
PROJECT (Analysisreg2)
SET(SRC_LIST main.cpp ntreg.cpp edlib.cpp)
MESSAGE(STATUS "This is BINARY dir " ${Analysisreg2_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${Analysisreg2_SOURCE_DIR})
ADD_EXECUTABLE(analysisreg2 SRC_LIST) 
SET命令の文法は:
SET(VER[VALE][CACHE TYPE DOCSTRING[FOCE])
今の段階では、SET命令を理解するだけで、明示的に変数を定義することができます。
例えば私達が使っているのはSETです。
mail.c)複数のソースファイルがあれば、以下のように定義することもできます。
SET(SRCcast mail.1.c t 2.c)
MESSAGE命令の文法は:
MESSAGE([SENDAGR𞓜STATUS𞓜FATALUERROR]「message to display」
…)
このコマンドは、ユーザ定義の情報を端末に出力するためのもので、3つのタイプが含まれている。
SEND_ERRORは、エラーが発生し、生成プロセスがスキップされます。
SATUSは、プレフィクスが─の情報を出力する。
FATAL_ERROR、直ちにすべてのcmakeプロセスを終了します。
ここではSTATUS情報出力を使って、PROJECT命令で定義された2つの暗黙的変数を実証します。
HELLO_BINARY_DIRとHELLO_SOURCE_DIR