[C++] 359 Makefileでワイルドカード使用 FLTKアプリ

[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0, FLTK 1.3.9]

Homebrewのライブラリをアップデートする度にMakefileにあるバージョン番号を更新しなくて済むようワイルドカードに置き換えました。

さらにライブラリへのリンクを意味する-lを正常に動作させるため、-Lオプションに/opt/homebrew/libを追加しました。

これまでは/opt/homebrew/Cellarにある各ライブラリのlibパスをわざわざ記入していました。/opt/homebrew/libにライブラリファイルがまとめられているとは知らなかったです。

今回の修正で大分洗練されたMakefileになったように思います。

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

# ビルドオプション
CPPFLAGS = $(shell fltk-config --use-gl --use-images --cxxflags ) -std=c++11
CPPFLAGS2 = $(shell pkg-config --cflags --libs opencv4 )
LDFLAGS = $(shell fltk-config --use-gl --use-images --ldflags ) -lc++

# includeパス(-I)
INCLUDE = -I./include -I/opt/homebrew/Cellar/libpng/*/include -I/opt/homebrew/Cellar/fltk/*/include \
-I/opt/homebrew/Cellar/opencv/*/include -I/opt/homebrew/Cellar/opencv/*/include/opencv4 \
-I/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10 \
-I/Volumes/DATA_m1/code/cpp/mylib/include

# リンク(-l)
LINK = -lz -lpng -lopencv_core -lopencv_imgcodecs -lopencv_highgui -lopencv_imgproc -lpython3.10

# ライブラリパス(-L)
LIBRARY = -L/usr/local/lib -L/opt/homebrew/lib \
-L/Library/Frameworks/Python.framework/Versions/3.10/lib \
/Volumes/DATA_m1/code/cpp/mylib/lib/Split.a

# ソースファイル
SRCDIR = ./src
SRCS = $(shell find $(SRCDIR) -type f)

# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(addprefix $(OBJDIR), $(patsubst ./src/%.cpp,/%.o,$(SRCS)))

# 実行ファイル
TARGETDIR = ./bin
TARGET = ImageInspector
	
# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
	$(COMPILER) $(CPPFLAGS) $(CPPFLAGS2) $(INCLUDE) $(DEBUG) -o $@ -c $<

# アプリファイル作成関連
POSTBUILD  = fltk-config --post

# oファイルから実行ファイルとappファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LINK) $(LIBRARY) $(LDFLAGS)
	cp $(TARGETDIR)/$(TARGET) $(TARGET)
	$(POSTBUILD) $(TARGET)
	mkdir $(TARGET).app/Contents/Resources
	cp ./images/$(TARGET).icns $(TARGET).app/Contents/Resources
	plutil -insert 'CFBundleIconFile' -string $(TARGET).icns $(TARGET).app/Contents/Info.plist
	rm -f $(TARGET)

# 全ソース強制コンパイル
.PHONY:all
all: clean $(TARGET)

# 全ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET) $(TARGET).app

[C++] 358 FLTKアプリ ビルド時のトラブル png.h

[Mac M2 Pro 12CPU, Sonoma 14.3.1, clang++ 15.0.0, FLTK 1.3.9]

アイコン画像作成アプリを久しぶりにビルドすると、png関連のシンボルが見つからずエラーを吐くようになりました。

これまでlibpngのpng.hへアクセスしていたのが、FL/images/png.hを読み込むようになってしまったために起こったトラブルでした。

ヘッダファイルのincludeを絶対パスにすると直りました。

Homebrewのライブラリをアップデートするとバージョン番号が変わるのでMakefileを更新する必要がありますが、それとは関係なく起こったレアなトラブルだったため原因究明に時間が掛かりました。

ld: Undefined symbols:
  _fltk_png_create_info_struct, referenced from:
      getInfoPNG(char const*) in processImage.o
  _fltk_png_create_read_struct, referenced from:
      getInfoPNG(char const*) in processImage.o
  _fltk_png_destroy_read_struct, referenced from:
      getInfoPNG(char const*) in processImage.o
  _fltk_png_get_channels, referenced from:
      getInfoPNG(char const*) in processImage.o
  _fltk_png_get_image_height, referenced from:
      getInfoPNG(char const*) in processImage.o
  _fltk_png_get_image_width, referenced from:
      getInfoPNG(char const*) in processImage.o
  _fltk_png_get_x_pixels_per_inch, referenced from:
      getInfoPNG(char const*) in processImage.o
  _fltk_png_get_y_pixels_per_inch, referenced from:
      getInfoPNG(char const*) in processImage.o
  _fltk_png_init_io, referenced from:
      getInfoPNG(char const*) in processImage.o
  _fltk_png_read_png, referenced from:
      getInfoPNG(char const*) in processImage.o
  _fltk_png_set_sig_bytes, referenced from:
      getInfoPNG(char const*) in processImage.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Makefile:53: ImageInspector] Error 1
#ifndef PROCESSIMAGE_H
#define PROCESSIMAGE_H

#include <array>
// FL/imagesのpng.hを避けるため絶対パスに変更
#include "/opt/homebrew/Cellar/libpng/1.6.42/include/libpng16/png.h"

std::vector<std::string> split(std::string, char);
std::string join(const std::vector<std::string>& , const char*);

int checkImage(const char*);
std::array<int,5> getInfoPNG(const char*);

#define SIGNATURE_NUM 8

#endif