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)
この例では、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
本書ではMinGWはサポートしませんし(少なくとも執筆時には)未検証なので、本項目は参考程度の注意で読んでください。Windows環境で開発しない方は飛ばして結構です。Unix/Linuxに慣れすぎて、Visual Studioを避けたい場合では有効なツールではあるかと思います。
WindowsではVisual Studioを使わずにC/C++でのコンパイルを行なうことができます。例えば項目名となるMakefileを使うのであれば、以下の3つの選択肢が代表的なものです。
MinGW-w64はMinGWの64ビット拡張版です。使用したことはありませんが、他の開発者も使っていると聞いております。
CygwinはPOSIX環境の忠実な際限を目的とするため、コンパイラやビルドツールとしては重量すぎます。そのためコンパイラとツールのみで構成されるMinGWをインストールして使うことが良くあります。筆者もWindowsの検証環境にはMinGWと、C/C++ライブラリを配置しています。
まず公式サイトからインストーラーをダウンロードして、インストールとパス設定をしてください。
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