[C++] 21 Makefile作例 srcディレクトリ単層

以前紹介したMakefileはsrcディレクトリ内にサブディレクトリがあるケースのものでしたが、サブディレクトリなしのMakefileを記しておきます。

# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# フラグ設定
CPPFLAGS = $(shell pkg-config libpng --cflags)
LDFLAGS = $(shell pkg-config libpng --libs)

# includeパス設定(-I)
INCLUDE = -I./include -I/opt/homebrew/Cellar/libpng/1.6.37/include

# ライブラリパス設定(-l)
LIBRARY0 =

# 優先ライブラリパス設定(-L)
LIBRARY = -L/opt/homebrew/Cellar/jpeg/9e/lib -L/opt/homebrew/Cellar/libpng/1.6.37/lib

# ソースファイル
SRCDIR = ./src
SRCS = $(SRCDIR)/main.cpp $(SRCDIR)/libpng_test.cpp

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(OBJDIR)/main.o $(OBJDIR)/libpng_test.o

# 実行ファイル
TARGETDIR = ./bin
TARGET = png_mono

# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/main.o: $(SRCDIR)/main.cpp
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

$(OBJDIR)/libpng_test.o: $(SRCDIR)/libpng_test.cpp
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET): $(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY0) $(LDFLAGS) $(LIBRARY)

# コンパイル&ビルド
all: clean $(TARGET)

# ファイル削除
clean:
	rm -rf $(OBJS) $(TARGET)

[C++] 20 Exiv2 Exifデータの取得

画像ファイルのinfoデータを取得する方法について調べていたらExifデータを取得するExiv2というライブラリを見つけたので試してみました。

Homebrewからインストールも可能ですが、今回は公式サイトからtar.gzファイルをDLしました。

最初はエラー出力から自力でフラグを探っていきましたが結局うまくいかず、CPPFLAGSやLDFLAGSをコマンドで取得しMakefileを作成しました。

公式サイトにあるexifprint.cppというソースコードでテストし、Exif全データを出力させることができました。

なおPCで作成した画像ファイルのinfoデータはこのライブラリでは読み取れません。あくまで写真のメタデータ取得用です。

# コンパイラ設定他
COMPILER = clang++
DEBUG = -g

# フラグ設定
CPPFLAGS = $(shell pkg-config exiv2 --cflags )
LDFLAGS = $(shell pkg-config exiv2 --libs )

# includeパス設定
INCLUDE =

# linkパス設定
LINK =

# ライブラリパス設定
LIBRARY =

# 実行ファイル設定
TARGET = exifprint
TARGETDIR = ../bin

# ソースコードパス
SRCROOT = .

# oファイルの出力ディレクトリ
OBJROOT = ../obj

# ソースディレクトリ
SRCDIR = ../src

# オブジェクトファイル
OBJECT = $(OBJROOT)/$(TARGET).o

# cppファイルからoファイル作成
$(OBJROOT)/%.o: $(SRCROOT)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET): $(OBJECT)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJECT) $(LINK) $(LDFLAGS) $(LIBRARY)

# コンパイル&ビルド
all: clean $(TARGET)

# ファイル削除
clean:
	rm -rf $(OBJECT) $(TARGETDIR)/$(TARGET)

作成した実行ファイルでExif全データを出力するコマンド

exifprint [画像ファイルパス]
Exif.Image.Make                              0x010f Ascii      18  NIKON CORPORATION
Exif.Image.Model                             0x0110 Ascii      11  NIKON D500
Exif.Image.Orientation                       0x0112 Short       1  1
Exif.Image.XResolution                       0x011a Rational    1  300/1
Exif.Image.YResolution                       0x011b Rational    1  300/1
Exif.Image.ResolutionUnit                    0x0128 Short       1  2
Exif.Image.Software                          0x0131 Ascii      10  Ver.1.20 

exifprint.cppソースコード