[C++] 198 FLTK : Makefileの改良 将棋エンジン”技巧2″を参考に

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, FLTK 1.3.8, NO IDE]

将棋エンジン”技巧2″のMakefileを参考に改良しました。とりあえずカラーアプリMac版をビルドできるようにしました。

GNU Makeはクセが強くてまだまだ修得したとは言えないレベルですが、大分マシになったと思います。

## General Settings(MacOSのみ)
# フラグ設定
CPPFLAGS = -std=c++17 
LDFLAGS = 

# includeパス(-I)
INCLUDE = -I./include -I/opt/homebrew/Cellar/libpng/1.6.37/include -I/usr/local/include \
-I/Volumes/DATA_m1/code/cpp/mylib/include

# ライブラリパス(-l)
LIBRARY_l = /Volumes/DATA_m1/code/cpp/mylib/lib/Funcs.a \
/Volumes/DATA_m1/code/cpp/mylib/lib/ColorConvert.a \
/Volumes/DATA_m1/code/cpp/mylib/lib/CharExtract.a \
/opt/homebrew/Cellar/fltk/1.3.8/lib/libfltk.a \
/Volumes/DATA_m1/code/cpp/mylib/lib/csvProcessChar.a \
/Volumes/DATA_m1/code/cpp/mylib/lib/Split.a \
/Volumes/DATA_m1/code/cpp/mylib/lib/csvProcessString.a \
/Volumes/DATA_m1/code/cpp/mylib/lib/csvProcessChar.a

# ライブラリパス(-L)
LIBRARY_L = 

## Compiler and Target Specific Settings
# MacOS [make mac]
ifeq ($(TARGET), mac)
	COMPILER = clang++
	CPPFLAGS += 
	LDFLAGS += -lc++ -framework Cocoa -w
endif
# MacOS(開発モード) [make macdev]
ifeq ($(TARGET), macdev)
	COMPILER = clang++
	CPPFLAGS += -g -DDEV
	LDFLAGS += -lc++ -framework Cocoa -w
endif
# Windows [make win]
ifeq ($(TARGET), win)
	COMPILER = g++
	CPPFLAGS += -DWIN32
	LDFLAGS += -static -lstdc++ -lgcc -lole32 -loleaut32 -luuid -lwsock32 -lgdi32 -lcomctl32 -mwindows
	LIBRARY_L += -L"C:\MinGW\mingw64\lib"
	ICON = .\images\icon.res
endif
# Windows(開発モード) [make windev]
ifeq ($(TARGET), windev)
	COMPILER = g++
	CPPFLAGS += -DWIN32 -Og -g
	LDFLAGS += -static -lstdc++ -lgcc -lole32 -loleaut32 -luuid -lwsock32 -lgdi32 -lcomctl32
	LIBRARY_L += -L"C:\MinGW\mingw64\lib"
	ICON = .\images\icon.res
endif

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

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

# 実行ファイル
BINDIR = ./bin
APP = ColorSampleJP
APPWIN = ColorSampleJP

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

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

## Public Targets
.PHONY:	mac macdev win windev

mac macdev:
	rm -rf $(OBJS) $(BINDIR)/$(APP) $(APP).app
	$(MAKE) TARGET=$@ $(APP)

win windev:
	del \Q $(OBJS) $(BINDIR)\$(APPWIN).exe
	$(MAKE) TARGET=$@ $(APPWIN)

## Private Targets
# MacOS(oファイルから実行ファイルとappファイル作成)
.PHONY: $(APP)
$(APP):$(OBJS)
	$(COMPILER) -o $(BINDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS)
	cp $(BINDIR)/$(APP) $(APP)
	$(POSTBUILD) $(APP)
	mkdir $(APP).app/Contents/Resources
	cp ./images/$(APP).icns $(APP).app/Contents/Resources
	plutil -insert 'CFBundleIconFile' -string $(APP).icns $(APP).app/Contents/Info.plist
	rm -f $(APP)

# Windows(oファイルからexeファイル作成)
.PHONY: $(APPWIN)
$(APPWIN):$(OBJS)
	$(COMPILER) -o $(BINDIR)\$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS) $(ICON)

[Swift] 14 ファイルのUniform Type Identifier(UTI)を取得

[M1 Mac, Big Sur 11.6.8, Swift 5.5.2, NO IDE]

久々のSwiftネタです。

ファイルのUTIを取得するコードを紹介します。Core Foundationを使用します。コードは参考サイトから拝借しました。

printutiファイルは新設した/usr/local/bin2に置き、パスを通して使えるようにしました。

C++でも出来なくはないみたいですが、かなりややこしそうなので素直にSwiftを使う方がいいようです。

Swiftコードをライブラリ化してC++で使いたいものの、さくっと調べた感じでは情報はありませんでした。

import Foundation

if let argument = CommandLine.arguments.dropFirst().first {
    let url = URL(fileURLWithPath: argument)
    if let uti = (try? url.resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier {
        print(uti)
    }
    else {
        print("UTI取得に失敗しました: \(argument)")
    }
}
// 実行ファイル作成(ファイル名はprintuti)
swiftc -o printuti main.swift

// UTIの取得
printuti [filepath]

// 使用例
~ $ printuti test.png 
public.png

参考サイト

[C++] 197 FLTK : カラーアプリ移植版のMicrosoft Store登録完了

[Windows11, MinGW g++ 9.2.0, FLTK 1.3.8, NO IDE]

Microsoft Storeに登録していたカラーアプリJava版をC++版に更新しました。前回の更新(申請No.18)が3月上旬ですから7ヶ月半ぶりになります。

アプリサイズは33MBから11MBになり、ウィジェットツールキットにFLTKを採用して高速・軽量アプリに生まれ変わりました。

特に急がず、だらだら取り組んだのでMac C++版からの移植・登録に12日も掛かりました。clang++からMinGW g++へのコンパイラ変更に伴う修正が想像以上にしんどかったです。

申請から公開までは約9時間半でした。審査の経過はMicrosoftパートナーセンターで確認しました。公開されてもメール通知はありません。

今後はタイトルバーのアイコン設定など細かいところをぼちぼち直していきます。

[C++] 196 GDBによるデバッグ例 stoi関数

[Windows11, MinGW g++ 9.2.0, FLTK 1.3.8, NO IDE]

MacOSから移植中のカラーアプリについてWindows環境のみでアプリが落ちる現象が発覚しましたので、早速GDBデバッガで調査しました。

コンパイル時に-Ogオプションを追加しないとオブジェクトファイルのデバッグへの最適化ができないので要注意です。実際に-Ogオプションなしでコンパイルすると関数指定や行数指定のブレークポイント設定が正確にできませんでした。

DEBUG = -Og -g

“b btnAction.cpp:showColor”コマンドでbtnAction.cppのshowColor関数にブレークポイントを設定し、rコマンドでアプリを実行しました。nコマンドでは関数はスキップして次の行に進み、sコマンドでは関数にも入り込んで次の行に進みます。

調査の結果、自製ライブラリColorConvertのZeroToRGB関数にあるstoi関数辺りに原因があることが判明しました。

対策:
invalid argumentエラーを例外処理するようにした。

clang++ではデフォルトで例外処理を包含しているようです。stoi関数の引数がNULLでもエラーになりません。clang++が甘々なのか、MinGWが厳しいのか。

int red;
int green;
int blue;

try{
    red = stoi(red0);
    green = stoi(green0);
    blue = stoi(blue0);
}catch(const std::invalid_argument& e){
    cout << "invalid argument" << endl;
}
>gdb ColorSample.exe
Reading symbols from ColorSample.exe...done.
(gdb) b btnAction.cpp:showColor
Breakpoint 1 at 0x406510: btnAction.cpp:showColor. (2 locations)
(gdb) r
Starting program: ColorSample.exe
[New Thread 6864.0x4334]
[New Thread 6864.0x968]
[New Thread 6864.0x2350]
[New Thread 6864.0x44b4]
locale Japanese_Japan.932
Japan detect
[New Thread 6864.0x43c0]
[New Thread 6864.0x3258]
[New Thread 6864.0x3bd8]

Breakpoint 1, showColor () at C:/FLTK/fltk-1.3.8/include/FL/Fl_Button.H:102
102       char value() const {return value_;}
(gdb) s
516         input_code = code_input->value();
(gdb) s
value (this=0xf485e0) at C:/FLTK/fltk-1.3.8/include/FL/Fl_Input_.H:244
244       const char* value() const {return value_;}
(gdb) n
showColor () at .\src\btnAction.cpp:516
516         input_code = code_input->value();
(gdb) n
517         if (input_code == ""){
(gdb) n
533         if (onoff_zero == 1){
(gdb) s
534             ToZeroConvert();
(gdb) s
ToZeroConvert () at .\src\btnAction.cpp:196
196         const char* input_code0 = code_input->value();
(gdb) p input_code0
$1 = <optimized out>
(gdb) s
value (this=0xf485e0) at C:/FLTK/fltk-1.3.8/include/FL/Fl_Input_.H:244
244       const char* value() const {return value_;}
(gdb) s
ToZeroConvert () at .\src\btnAction.cpp:197
197         input_code = string(input_code0);
(gdb) p input_code
No symbol "input_code" in current context.
(gdb) s
basic_string<> (__a=..., __s=0xf5f498 "0x483D", this=0xdaf334) at .\src\btnAction.cpp:197
197         input_code = string(input_code0);
(gdb) p input_code
No symbol "input_code" in current context.
(gdb) s
_Alloc_hider (__a=..., __dat=0xdaf33c "\375\023爽リ\023爽蝗^ツ\032        \r", this=0xdaf334)
    at c:/mingw/lib/gcc/mingw32/9.2.0/include/c++/ext/new_allocator.h:83
83            new_allocator(const new_allocator&) _GLIBCXX_USE_NOEXCEPT { }
(gdb) s
basic_string<> (__a=..., __s=0xf5f498 "0x483D", this=0xdaf334)
    at c:/mingw/lib/gcc/mingw32/9.2.0/include/c++/bits/basic_string.h:527
527           { _M_construct(__s, __s ? __s + traits_type::length(__s) : __s+npos); }
(gdb) n
ToZeroConvert () at .\src\btnAction.cpp:197
197         input_code = string(input_code0);
(gdb) n
199         if (input_code.find("#") != string::npos){
(gdb) n
230         } else if (input_code.find("0x") != string::npos){
(gdb) n
[New Thread 6864.0x3a8c]
232             code_zero = input_code;
(gdb) s
operator= (__str=..., this=0x52f094 <code_zero[abi:cxx11]>) at .\src\btnAction.cpp:232
232             code_zero = input_code;
(gdb) s
assign (__str=..., this=0x52f094 <code_zero[abi:cxx11]>)
    at c:/mingw/lib/gcc/mingw32/9.2.0/include/c++/bits/basic_string.h:1364
1364          assign(const basic_string& __str)
(gdb) s
_fu21___ZSt4cout () at .\src\btnAction.cpp:235
235             baseColor = CC.ZeroToRGB(input_code);
(gdb) s
basic_string (__str=..., this=0xdaf3c4) at .\src\btnAction.cpp:235
235             baseColor = CC.ZeroToRGB(input_code);
(gdb) s
_Alloc_hider (__a=<optimized out>, __dat=0xdaf3cc "\a", this=0xdaf3c4)
    at c:/mingw/lib/gcc/mingw32/9.2.0/include/c++/ext/new_allocator.h:83
83            new_allocator(const new_allocator&) _GLIBCXX_USE_NOEXCEPT { }
(gdb) s
basic_string (__str=..., this=0xdaf3c4) at c:/mingw/lib/gcc/mingw32/9.2.0/include/c++/bits/basic_string.h:451
451           { _M_construct(__str._M_data(), __str._M_data() + __str.length()); }
(gdb) s
_M_data (this=<optimized out>) at c:/mingw/lib/gcc/mingw32/9.2.0/include/c++/bits/basic_string.h:186
186           _M_data() const
(gdb) s
basic_string (__str=..., this=0xdaf3c4) at c:/mingw/lib/gcc/mingw32/9.2.0/include/c++/bits/basic_string.h:936
936           length() const _GLIBCXX_NOEXCEPT
(gdb) s
451           { _M_construct(__str._M_data(), __str._M_data() + __str.length()); }
(gdb) s
_M_construct<char*> (__end=0x53b0fa <input_code[abi:cxx11]+14> "", __beg=0x53b0f4 <input_code[abi:cxx11]+8> "0x483D",
    this=0xdaf3c4) at c:/mingw/lib/gcc/mingw32/9.2.0/include/c++/bits/basic_string.h:451
451           { _M_construct(__str._M_data(), __str._M_data() + __str.length()); }
(gdb) s
_M_construct_aux<char*> (__end=0x53b0fa <input_code[abi:cxx11]+14> "",
    __beg=0x53b0f4 <input_code[abi:cxx11]+8> "0x483D", this=0xdaf3c4)
    at c:/mingw/lib/gcc/mingw32/9.2.0/include/c++/bits/basic_string.h:263
263             _M_construct(_InIterator __beg, _InIterator __end)
(gdb) n // ここでアプリが落ちた
[New Thread 6864.0x2a54]
[New Thread 6864.0x24c4]
terminate called after throwing an instance of 'std::invalid_argument'
  what():  stoi
[Inferior 1 (process 6864) exited with code 03]
(gdb) quit
GCC公式ドキュメント -Ogオプションに関する記述

[C++] 195 ローカライズ対応 日本語・英語

[Windows11, MinGW g++ 9.2.0, FLTK 1.3.8, NO IDE]

カラーアプリWindows版をローカライズ対応させました。

LC_CTYPEマクロでロケールを取得し、その結果によって変数を決定するようにしました。

MacOSではLC_CTYPE=”ja_JP.UTF-8″等になるため、#ifdefでOS毎の切り替えが必要になります。

ネット検索の上位結果にはこのような情報は見当たりませんでした。これ位は簡単に思いつくので記事にするまでもないということでしょうか。

タブ名のみ英語対応
vector<string> tab_names;

int main(int argc, char **argv) {
    char* locale = setlocale(LC_CTYPE, "");
    cout << "locale " << locale << endl;
    char* p = strstr(locale,"Japan");

    if (p != NULL){
        cout << "Japan detect" << endl;
        tab_names = { "140色", "和色赤系", "和色黄系", "和色青系", "和色黒系"};
    } else {
        tab_names = { "140 COLORS", "TRAD RED", "TRAD YEL", "TRAD BLUE", "TRAD BLACK"};
    }

[C++] 194 Windowsアプリにおけるコンソール表示およびコマンド

[Windows11, g++ 9.2.0, FLTK 1.3.8, NO IDE]

MacOSアプリをWindowsに移植する際、修正すべき箇所がありましたのでメモしておきます。

1.g++ビルド時のオプション
-mwindowsオプションを付けると起動時にコンソールが開かなくなります。

GCCのオプションについてはネット検索してもあまりヒットしないことがあります。GCCマニュアルをダウンロードしておいて調べるのが効率的です。
GCC online documentation

GCCオプションをまとめているサイトを見てもおそらく答えはありません。オラクルなど有名企業のサイトでも不十分です。最初から公式ドキュメントをあたるのが得策かと思います。

そもそもネット検索してもSEO対策を施した初心者向けの薄い記事しかヒットしないので、よほどの急ぎでない限りは公式ドキュメントで調べたいものです。

2.コンソールコマンド
MacOSのprintfやpbcopyに相当するコマンドを調べる必要がありました。

// クリップボードにコピー

// MacOS
string cmd = "printf '" + 変数 + "' | pbcopy"; // printfはechoでも可
system(cmd.c_str());

// Windows
string cmd = "echo '" + 変数 + "' | C:\\Windows\\System32\\clip.exe";
system(cmd.c_str());

[C++] 193 Windows11でユーザ名を取得

[Windows11, g++ 9.2.0, FLTK 1.3.8, NO IDE]

MacOSのC++ではgetenv関数でホームディレクトリを取得していましたが、Windows11ではうまく動作しなかったので他の方法を考えました。

WindowsAPIはVisual C++をVisual Studioで使うという環境でのみ使用できるものと勝手に思いこんでいましたが、MinGWのC++でもいけるんですね。

そうであれば非IDE環境でWindowsAPIを使ったGUIプログラミングを近いうちに手掛けてみたいです。

Visual Studioがあまり好きでないだけで、WindowsAPIには大いに興味があります。

#include <windows.h>
string appdir;

// アプリ用ディレクトリ名の作成
char username[256];
DWORD dwSize = sizeof(username)/sizeof(username[0]);
GetUserName(username, &dwSize);
string prefix = "C:\\Users\\";
string suffix = "\\ColorSampleJP";
appdir = prefix + string(username) + suffix;

[C++] 192 FLTK : Windows11でのビルド成功 Makefile

[Windows11, g++ 9.2.0, FLTK 1.3.8, NO IDE]

カラーアプリFLTK版のMacからの移植が一応完了しました。

MakefileをWindows仕様に書き換えるのに半日かかりました。地道に情報収集しながら足りないライブラリを追加していき、完成にこぎつけました。

相変わらずWindowsのシステムフォントが今ひとつなので独自フォントを作成して導入したいのですが、これは中長期的課題としておきます。

次は英語版へのローカライズ対応です。Javaでしか経験がないため一から調べることになります。

まあ日本語を廃して英語版でリリースするのもありかなと考えています。

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

# フラグ設定
CPPFLAGS = $(fltk-config --use-gl --use-images --cxxflags) -std=c++17 -D WIN32
LDFLAGS = $(fltk-config --use-gl --use-images --ldflags)

# includeパス(-I)
INCLUDE = -I"C:\MinGW\include" -I"C:\FLTK\fltk-1.3.8\include" \
-I"D:\code\cpp\mylib\include" -I"D:\code\cpp\projects\ColorSampleJP\include"

# ライブラリパス(-l)
LIBRARY_l = "C:\FLTK\fltk-1.3.8\lib\libfltk.a" "D:\code\cpp\mylib\lib\Funcs.a" \
"D:\code\cpp\mylib\lib\ColorConvert.a" "D:\code\cpp\mylib\lib\CharExtract.a" \
"D:\code\cpp\mylib\lib\csvProcessChar.a" "D:\code\cpp\mylib\lib\Split.a" \
"D:\code\cpp\mylib\lib\csvProcessString.a"

# ライブラリパス(-L)
LIBRARY_L = 

# 追加ライブラリパス
LIB_ADD = -L"C:\MinGW\mingw64\lib" -mwindows -lgcc -lole32 -loleaut32 -luuid -lwsock32 -lgdi32 -lcomctl32

# ソースファイル
SRCDIR = .\src
SRCS = $(SRCDIR)\btnAction.cpp $(SRCDIR)\FileChooser.cpp $(SRCDIR)\FileChooser2.cpp $(SRCDIR)\main.cpp $(SRCDIR)\modalDialog.cpp $(SRCDIR)\searchLocation.cpp

# オブジェクトファイル
OBJDIR = .\obj
OBJS = $(OBJDIR)\btnAction.o $(OBJDIR)\FileChooser.o $(OBJDIR)\FileChooser2.o $(OBJDIR)\main.o $(OBJDIR)\modalDialog.o $(OBJDIR)\searchLocation.o

# 実行ファイル
TARGETDIR = .\bin
TARGET = ColorSample

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

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

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

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

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

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

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)\$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LIB_ADD) $(LDFLAGS)

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

# ファイル削除
.PHONY:clean
clean:
	del /Q $(OBJS) $(TARGETDIR)\$(TARGET).exe

ビルドオプション参考サイト

[C++] 191 FLTK : Windows11での開発環境構築 

[Windows11, g++ 9.2.0, FLTK 1.3.8, NO IDE]

Windows11機にFLTKをインストールしました。

FLTKのソースコードをダウンロード&解凍し、MinGWと同じ階層にフォルダを置きます。そしてMinGW(MSYS)系Bashを立ち上げてMakeするだけです。WSL系BashではMakeできないので要注意です。

最初はWSL系Bashで何とかしようとして泥沼にハマり、Visual Studioでの導入を試みてもVisual C++ 2010までしか対応しておらず途方にくれました。

FLTK公式サイトの掲示板で導入方法に関する資料がGoogleドライブに公開されていることを知り、これを入手して何とか解決できました。この資料へのアクセス数は200程度でした。

Visual C++がほとんどと思われるWindowsのC++ユーザーの中でFLTKにこだわって上記情報にたどり着き、かつインストールした奇特な方は日本ではほぼ皆無でしょう。

参考資料

参考資料におけるBash起動バッチファイルの説明箇所(ドイツ語、英語)
FLTK公式サイト

[C++] 190 Windows11での開発環境構築 Make for Windows他

[Windows11, g++ 9.2.0, NO IDE]

Windows11でFLTKアプリを開発できる環境を構築していきます。ブラックボックス嫌いの非IDE派なので、基本Visual Studioは使いません。

g++コンパイラは以前MinGW版をインストールしていたのでそのまま使います。GDBデバッガも同梱されています。

次にMake for Windowsをインストールしてから、Makefileの内容をWindows仕様に書き換えます(rmコマンド→delコマンドなど)。Macから持ってきたコードはShift-JISに変換して使います。

これでMakefileを使ったHello Worldを実行できるようになりました。Macの時の癖でつい実行ファイルをダブルクリックしてしまいます。Windowsの場合はコマンドプロンプトにファイル名を入力して実行します。

続いてFLTKのインストールですが、次回以降記事にします。

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

# オプション設定
CPPFLAGS = -std=c++11

LDFLAGS =

# includeパス(-I)
INCLUDE = 

# ライブラリパス(-l)
LIBRARY_l = 

# ライブラリパス(-L)
LIBRARY_L = 

# ソースファイル
SRCDIR = .
SRCS = test.cpp

# オブジェクトファイル
OBJDIR = .
OBJS = test.o

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

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

# 全ソース・コンパイル&ビルド
.PHONY:all
all: clean $(OBJS) $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	del /Q $(OBJS) $(TARGET)