make
において、以下の構成でプロジェクトを作成したいのですが、objディレクトリにオブジェクトファイルを格納するようなMakefile
はどのように作れば良いでしょうか。
環境構成
./
├ bin/ # 実行ファイル用ディレクトリ
├ include/ # インクルードファイル用ディレクトリ
│ └ Util.h
├ obj/ # オブジェクトファイル用ディレクトリ
├ src/ # ソースコード用ディレクトリ
│ ├ main.cxx
│ └ Util.cxx
└ Makefile
一応以下のやり方で実行ファイルの生成は出来ましたが、カレントディレクトリにオブジェクトファイルができてしまい、所望の動作ではないです。
(中途半端な変数化はスルーしてください・・・)
TARGET=./bin/test
SOURCES=$(wildcard src/*.cxx)
OBJECTS=$(notdir $(SOURCES:.cxx=.o))
VPATH=src
.SUFFIXES: .cxx .o
$(TARGET): $(OBJECTS)
rm -f $@
g++ -Wall -I./include -o $@ $^
.cxx.o:
g++ -Wall -I./include -c $<
.PHONY: all clean
all:
echo $(SOURCES)
echo $(OBJECTS)
clean:
rm -f *.o bin/*
オブジェクトファイルをobjディレクトリに格納するため、以下のようにしましたが、make
時にエラーになってしまいます(-c $<
が常にUtil.cxx
を指してしまう)。
TARGET=./bin/test
SOURCES=$(wildcard src/*.cxx)
OBJECTS=$(patsubst src/%.cxx, obj/%.o, $(SOURCES))
$(TARGET): $(OBJECTS)
rm -f $@
g++ -Wall -I./include -o $@ $^
$(OBJECTS): $(SOURCES)
g++ -Wall -I./include -o $@ -c $<
.PHONY: all clean
all:
echo $(SOURCES)
echo $(OBJECTS)
clean:
rm -f bin/* obj/*
実行結果
$ make
g++ -Wall -I./include -o obj/Util.o -c src/Util.cxx
g++ -Wall -I./include -o obj/main.o -c src/Util.cxx # ここがNG。src/main.cxxになって欲しい
環境
GNU Make 3.81