はじめに
今回の記事では、Makefileの書き方について紹介していきます。
以前にMakefileの基本的な話は忘れないようにメモ書きしたので、
次はもう少し実践的な使い方について確認しておきます。
以前に、Makefileの基本について書きました。
今記事では、前回の内容よりもう少し実践的な使い方を紹介します。
もし興味がある方やちょっとMakefileについて忘れたって人は、この記事も是非参考にしてみてください。
複数ファイルへヘッダーファイルを含めるパターン
前回時期で、main.cファイルのみの方法は書きました。
ですが、実際に開発などを行う時は複数ファイルに分けてソースコードを作成しますよね?
処理内容毎にファイルを生成したりヘッダーファイルを用意したりライブラリを使ったりもしますよね。
次は、上記を考慮したMakefileの記述方法です。
例として、四則演算を含めたarithmeticOperations.cを用意します。
それと追加で、includeディレクトリにarithmeticOperations.hを用意します。
まずは、arithmeticOperationsのヘッダーファイルとソースファイルを作成しましょう。
#pragma once
#include "Automatic.h"
int addition(int x, int y);
int subtraction(int x, int y);
int multiplication(int x, int y);
int division(int x, int y);
#include "Automatic.h"
int addition(int x, int y) {
return x + y;
}
int subtraction(int x, int y) {
return x- y;
}
int multiplication(int x, int y) {
return x * y;
}
int division(int x, int y) {
return x / y;
}
これで、四則演算用を書いたファイルを用意しました。
あとは、main.cでこれらを呼び出すだけです。
以下がヘッダーファイルを追加して四則演算を呼び出したmain.cです。
#include <stdio.h>
#include "arithmeticOperations.h"
int main() {
printf("hello World\n");
printf("add->%d\n", addition(10, 3));
printf("sub->%d\n", subtraction(2, 1));
printf("mul->%d\n", multiplication(9,9));
return 0;
}
もちろん、読み込むファイルが追加されたので、「make all」する前にMakefileにも追記する必要があります。
ということで変更を加えたMakefileになります。
CC = gcc
CFLAGS = -g -Wall -O2
INCLUDE = -I ../include
TARGET = ../bin/hello
OBJDIR = ../obj
#変更点
# - SOURCE = main.c
# + SOURCE = main.c arithmeticOperations.c
SOURCE = main.c arithmeticOperations.c
OBJECTS = $(addprefix $(OBJDIR)/, $(SOURCE:.c=.o))
$(TARGET) : $(OBJECTS)
mkdir -p $(dir $@)
$(CC) $^ -o $(TARGET)
$(OBJDIR)/%.o : %.c
mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $<
all : $(TARGET)
clean :
rm -rf $(OBJECTS) $(TARGET)
これで「make all」とすることで、複数ファイルまとめてビルドできます。
ライブラリファイルをリンクする方法
次は、リンクしたいライブラリがある場合です。
例としてMathライブラリを使っていきます。
※開発環境によっては、Mathライブラリはリンク不要かもしれません。
ということで、まずは以前に作成したarithmeticOperationsファイルに変更加えます。
#include "arithmeticOperations.h"
#include <math.h>
int addition(int x, int y) {
return x + y;
}
int subtraction(int x, int y) {
return x- y;
}
int multiplication(int x, int y) {
return x * y;
}
int division(int x, int y) {
return x / y;
}
double sin(double x) {
return sin(x);
}
#pragma once
#include "arithmeticOperations.h"
int addition(int x, int y);
int subtraction(int x, int y);
int multiplication(int x, int y);
int division(int x, int y);
double sin(double x);
Makefileでマクロを定義する方法
マクロをMakefile内で定義することも可能です。
これについてもメモしておきます。
gccコンパイラではDオプションを利用することでマクロ定義を行うことができます。
オブジェクトファイル生成時にDオプションを利用してください。
CC = gcc
CFLAGS = -g -Wall -O2
INCLUDE = -I ../include
TARGET = ../bin/hello
OBJDIR = ../obj
LIBS = -lm
#追加 -Dオプションでマクロ定義
# + MACRO = -DDEV
MACRO = -DDEV
SOURCE = main.c arithmeticOperations.c
OBJECTS = $(addprefix $(OBJDIR)/, $(SOURCE:.c=.o))
$(TARGET) : $(OBJECTS)
mkdir -p $(dir $@)
$(CC) $^ -o $(TARGET) $(LIBS)
#変更点
# - $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $<
# + $(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $< $(MACRO)
$(OBJDIR)/%.o : %.c
mkdir -p $(dir $@)
$(CC) $(CFLAGS) $(INCLUDE) -o $@ -c $< $(MACRO)
all : $(TARGET)
clean :
rm -rf $(OBJECTS) $(TARGET)
まとめ
これで自身でMakefileを書く時に困らないからめでたしめでたし。