当前位置: 技术问答>linux和unix
关于Makefile
来源: 互联网 发布时间:2016-05-04
本文导语: .PHONY = all clean veryclean TARGET = test_main SOURCES = $(wildcard *.c) $(wildcard *.cc) $(wildcard *.cxx) $(wildcard *.cpp) OPT = -g -O0 -Wall CC = gcc CFLAGS += $(OPT) CXX = g++ CXXFLAGS += $(OPT) OBJS = $(addsuffix .o, $(basename $(SOURCES))) L...
.PHONY = all clean veryclean
TARGET = test_main
SOURCES = $(wildcard *.c) $(wildcard *.cc) $(wildcard *.cxx) $(wildcard *.cpp)
OPT = -g -O0 -Wall
CC = gcc
CFLAGS += $(OPT)
CXX = g++
CXXFLAGS += $(OPT)
OBJS = $(addsuffix .o, $(basename $(SOURCES)))
LIBS = -lpthread
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(LDFLAGS) $^ -o $@ $(LIBS)
clean:
-rm -rf *.o *.d core*
veryclean: clean
-rm -rf $(TARGET)
# common block
# add auto dependency generation to default rule
COMPILE.c += -MMD
COMPILE.cc += -MMD
DFILES := $(OBJS:.o=.d)
ifneq (${MAKECMDGOALS}, clean)
-include $(DFILES)
endif
# end of common block
小弟刚学Makefile, 网上找了一个,有几点看不明白, 请赐教
1.$(LDFLAGS) 没有定义,展开却和CXXFLAGS相同?
2.COMPILE.c += -MMD
COMPILE.cc += -MMD 是什么意思?
3.$(CXX) $(LDFLAGS) $^ -o $@ $(LIBS)如何展开,为什么最后的目标文件也在这里展开
TARGET = test_main
SOURCES = $(wildcard *.c) $(wildcard *.cc) $(wildcard *.cxx) $(wildcard *.cpp)
OPT = -g -O0 -Wall
CC = gcc
CFLAGS += $(OPT)
CXX = g++
CXXFLAGS += $(OPT)
OBJS = $(addsuffix .o, $(basename $(SOURCES)))
LIBS = -lpthread
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(LDFLAGS) $^ -o $@ $(LIBS)
clean:
-rm -rf *.o *.d core*
veryclean: clean
-rm -rf $(TARGET)
# common block
# add auto dependency generation to default rule
COMPILE.c += -MMD
COMPILE.cc += -MMD
DFILES := $(OBJS:.o=.d)
ifneq (${MAKECMDGOALS}, clean)
-include $(DFILES)
endif
# end of common block
小弟刚学Makefile, 网上找了一个,有几点看不明白, 请赐教
1.$(LDFLAGS) 没有定义,展开却和CXXFLAGS相同?
2.COMPILE.c += -MMD
COMPILE.cc += -MMD 是什么意思?
3.$(CXX) $(LDFLAGS) $^ -o $@ $(LIBS)如何展开,为什么最后的目标文件也在这里展开
|
1 LDFLAGS 没有显式定义,所以是空的,而 CXXFLAGS 是定义过的,两者不可能相同
不知 lz 从哪看两者展开是相同的
2 -MMD 是 gcc 中跟预处理相关的选项,具体见 gcc 文档
3 $(CXX) $(LDFLAGS) $^ -o $@ $(LIBS) 的话,直接替换就行了
g++ $(OBJS) -o $(TARGET) -lpthread
其实,lz 可能不知道的是这里用 make 的隐式规则
因为 Makefile 里没有写 obj 生成的命令,所以按隐式规则编译
COMPILE.c 这些是隐式规则里指定编译器和编译选项的变量
切换到没有 makefile 的目录,用 make -p 就可以看到全部的隐式规则
不知 lz 从哪看两者展开是相同的
2 -MMD 是 gcc 中跟预处理相关的选项,具体见 gcc 文档
3 $(CXX) $(LDFLAGS) $^ -o $@ $(LIBS) 的话,直接替换就行了
g++ $(OBJS) -o $(TARGET) -lpthread
其实,lz 可能不知道的是这里用 make 的隐式规则
因为 Makefile 里没有写 obj 生成的命令,所以按隐式规则编译
COMPILE.c 这些是隐式规则里指定编译器和编译选项的变量
切换到没有 makefile 的目录,用 make -p 就可以看到全部的隐式规则
|
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。