在gnu makefile中指定编译器

jrm*_*jrm 1 makefile gnu-make

我有一个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)
Run Code Online (Sandbox Code Playgroud)

当我将编译器从g ++改为类似/ usr/local/bin/g ++ 46时,它仍然用g ++编译(确切地说是/ usr/bin/g ++).为什么?

PS欢迎对模板提出任何批评.我对gnu make不太满意; 我只是挤在网​​上搜索了一天,想出了这个.

Oli*_*rth 5

您没有为如何构建目标文件指定自己的规则,因此Make使用默认的隐式规则,即:

$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
Run Code Online (Sandbox Code Playgroud)

注意$(CXX),不是$(CC),它指定了默认的C编译器.