C.1. Makefile

注記

JNIとJNAの項目に進む方はMakefileによるビルドを学ぶと便利です。

読者のC言語のバックグラウンドをお持ちであるはずなので、Makefileについては直接編集せずとも実行したり変数を触った経験はあるものと想定します。

本書ではソースのコンパイルとリンクはVisual Studio、XCode、EclipseなどのIDEを使わずMakefile(cmakeを使って生成)を使います。その理由としてはIDEでのライブラリーのリンクやヘッダーのインクルードの設定を省くことで想定外なエラーが発生することを抑制するためです。

Makefileをテキストファイルで編集する場合、makeがインストールされたコンパイルを自動化することにあります。

注記

IDEについて著者はEclipseとXCodeを使用しています。

以下のMakefileはMAC OSXでC/C++のプロジェクとをビルドするための雛形です。

Makefile. 

SRC=basic_helloworld

LIB =
CXX = clang

CXXFLAGS= -Wall -DUNIX -g -DDEBUG
BFLAG = $(strip $(shell uname -m | grep 64))
OS = $(shell uname -s)
COMPAT = $(findstring Darwin, $(OS))


ifneq ($(COMPAT),)
        LIB += -framework OpenCL
        ifeq ($(BFLAG),)
                CXXFLAGS +=-arch i386
        else
                CXXFLAGS +=-arch x86_64
        endif
endif

$(SRC): $(SRC).cxx
        $(CXX) $(CXXFLAGS) -o $@ $^ $(LIB)

.PHONY: clean

clean:
        rm $(SRC)

表C.1 makeルール内のマクロ

$@

ルールのターゲット名

$^

依存ファイル名、 スペースで他のファイルと区切り

$<

始めの依存性


この例では、basic_helloworld.cxxというファイルから、basic_helloworldというバイナリの実行ファイルが生成されるMakefileを書いてみました。

Makefileを実行するには、ただ「make」とコマンドラインに打ち込んで頂くだけで結構です。

$ make
clang -Wall -DUNIX -g -DDEBUG -arch x86_64 -o basic_helloworld basic_helloworld.cxx  -framework OpenCL

表C.2 CFLAGの一覧

-o filename

 出力する実行ファイル、ライブラリを指定

-Werror

 警告をエラーとすして表示。

-Wall

 追加警告を表示。

-w

 警告を抑制する。

-I dir

 インクルードしたファイルを検索するディレクトリを指定。

-L dir

 ライブラリを検索するディレクトリを指定。

-llib

 リンクしたライブラリを指定。(例:-lOpenCL)

-g

 ビルド中のデバッグ情報を表示。

-v

 ビルド中のコマンドを表示。

-O0,-O1,-O2,-O3

 最適化の指定。数が高いほど密度のある最適化。

-E

 ファイルの前処理。コンパイルしない。

-S

 ファイルの前処理とコンパイル。アセンブルしない。

-c

 コンパイルとアセンブルしない。リンクしない。

これでbasic_helloworldという実行ファイルができたので、実行してみましょう。

$ ./basic_helloworld
HelloWorld!!!

このプログラムは、「HelloWorld!!!」という文字列が出力するものとし、正常に動作したことが確認できました。

最後にmakeのあとにclean引数を入力して、makeのターゲットをcleanに設定して実行ファイルを削除させることができます。

$ make clean
rm basic_helloworld

C.1.1. Makefile(MinGW)

警告

本書ではMinGWはサポートしませんし(少なくとも執筆時には)未検証なので、本項目は参考程度の注意で読んでください。Windows環境で開発しない方は飛ばして結構です。Unix/Linuxに慣れすぎて、Visual Studioを避けたい場合では有効なツールではあるかと思います。

WindowsではVisual Studioを使わずにC/C++でのコンパイルを行なうことができます。例えば項目名となるMakefileを使うのであれば、以下の3つの選択肢が代表的なものです。

  • Cygwin
  • MinGW (Minimalist GNU for Windows)
  • Mingw-w64

注記

MinGW-w64はMinGWの64ビット拡張版です。使用したことはありませんが、他の開発者も使っていると聞いております。

CygwinはPOSIX環境の忠実な際限を目的とするため、コンパイラやビルドツールとしては重量すぎます。そのためコンパイラとツールのみで構成されるMinGWをインストールして使うことが良くあります。筆者もWindowsの検証環境にはMinGWと、C/C++ライブラリを配置しています。

まず公式サイトからインストーラーをダウンロードして、インストールとパス設定をしてください。

  • mingw32-make、mingw32-gcc、mingw32-g++をコマンドラインで叩いてみてパスが正常に設定されているか、動作するか確認ください。
  • MinGWをインストールしたフォルダには、「msys」というサブフォルダがあり、「msys.bat」というバッチを開くと

mingw32-gccはUnix/Linuxでの「gcc」に相当するものです。mingw32-makeはUnix/Linuxでの「make」(MSCVRT.dllの「make」と異なる)に相当するものです。

プログラムのビルドと動作確認をするには以下のようにすればできます。

> mingw32-gcc -o helloworld helloworld.c
> file helloworld.exe

mingw32-makeでは、GNU makeと同様な記述ができますが、コンパイラはmingw32-gccとなることに注意ください。Makefileについては、MinGWでも「Makefile」という名称で記述します。

Makefile. 

CC = mingw32-gcc
helloworld: helloworld.c
    $(CC) -o helloworld helloworld.c

コードを奇麗にしたい場合は、以下のように自動変数を使います。

CC = mingw32-gcc
helloworld: helloworld.c
    $(CC) -o $@ $^

後はMakefileを配置したフォルダをワーキングディレクトリに設定して「mingw32-make」をコマンドで叩いてコンパイルすればビルドの(部分的)自動化ができます。

Copyright 2018-2019, by Masaki Komatsu