1

うまく機能する gnu makefile テンプレートがありますが、パスの最初の g++ 以外のコンパイラを指定しようとすると失敗します。

これがテンプレートです。

CXX = g++
CXXFLAGS = $(INC) $(LIB) -Wall
INC = -I./ -I/usr/local/include
LIB = -L/usr/local/lib
SRCS = \
blah1.cpp
blah2.cpp

OBJS = $(SRCS:.cpp=.o)
DEPS = $(SRCS:.cpp=.d)
PROG = myprog

$(PROG):    $(OBJS)
    $(CXX) $(CXXFLAGS) -o $@ $(OBJS)

%.d: %.cpp
    @set -e; rm -f $@; \
    $(CXX) -MM $(CXXFLAGS) $< > $@.$$$$; \
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
    rm -f $@.$$$$

debug: CXXFLAGS += -O0 -DDEBUG -ggdb
debug: $(PROG)

-include $(DEPS)

.PHONY: clean
clean:
    rm -f $(DEPS) $(OBJS) $(PROG)

コンパイラを g++ から /usr/local/bin/g++46 のようなものに変更しても、g++ (正確には /usr/bin/g++) でコンパイルされます。なんで?

PS テンプレートに関する批判は大歓迎です。私は gnu make にあまり慣れていません。これを思いつくために、ウェブを1日詰め込んで検索しました。

4

1 に答える 1

5

オブジェクト ファイルの作成方法について独自のルールを指定していないため、Make はデフォルトの暗黙のルールを使用します。

$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

$(CXX)ではなく$(CC)、デフォルトのCコンパイラを指定することに注意してください。

于 2012-06-26T17:17:33.120 に答える