[C言語] Makefileの書き方その2(応用)

C言語/C++
スポンサーリンク

はじめに

今回の記事では、Makefileの書き方について紹介していきます。
以前にMakefileの基本的な話は忘れないようにメモ書きしたので、
次はもう少し実践的な使い方について確認しておきます。

以前に、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)
解説1

変更点は、SOURCE〜行です
複数ファイルまとめてコンパイル、ビルドしたい場合は、
SOURCEのmain.cの後に追加したいファイル名を入力する

これで「make all」とすることで、複数ファイルまとめてビルドできます。

ライブラリファイルをリンクする方法

次は、リンクしたいライブラリがある場合です。
例としてMathライブラリを使っていきます。
※開発環境によっては、Mathライブラリはリンク不要かもしれません。

Mathライブラリをリンクする時のポイント
  • ソースコード内にinclude <math.h> を追加
  • コンパイルする時に、 -lm をつける必要がある

 ということで、まずは以前に作成した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を書く時に困らないからめでたしめでたし。

GNU make
GNU make
この記事を書いた人
プロフィール

サイト管理人
プログラマーを6年程しています。
プログラミングの情報やPC情報などを中心にアップしています。
得意言語:C言語/C++,Python,C#

夢犬をフォローする
スポンサーリンク
C言語/C++
夢犬をフォローする
タイトルとURLをコピーしました