############################################################################
# 'A Generic Makefile for Building Multiple main() Targets in $PWD'
# Author: Robert A. Nader (2012)
# Email: naderra at some g
# Web: xiberix
############################################################################
# The purpose of this makefile is to compile to executable all C source
# files in CWD, where each .c file has a main() function, and each object
# links with a common LDFLAG.
#
# This makefile should suffice for simple projects that require building
# similar executable targets. For example, if your CWD build requires
# exclusively this pattern:
#
# cc -c $(CFLAGS) main_01.c
# cc main_01.o $(LDFLAGS) -o main_01
#
# cc -c $(CFLAGS) main_2..c
# cc main_02.o $(LDFLAGS) -o main_02
#
# etc, ... a common case when compiling the programs of some chapter,
# then you may be interested in using this makefile.
#
# What YOU do:
#
# Set PRG_SUFFIX_FLAG below to either 0 or 1 to enable or disable
# the generation of a .exe suffix on executables
#
# Set CFLAGS and LDFLAGS according to your needs.
#
# What this makefile does automagically:
#
# Sets SRC to a list of *.c files in PWD using wildcard.
# Sets PRGS BINS and OBJS using pattern substitution.
# Compiles each individual .c to .o object file.
# Links each individual .o to its corresponding executable.
#
###########################################################################
#
PRG_SUFFIX_FLAG := 0
#
LDFLAGS :=
CFLAGS_INC :=
CFLAGS := -g -Wall $(CFLAGS_INC)
#
## ==================- NOTHING TO CHANGE BELOW THIS LINE ===================
##
SRCS := $(wildcard *.c)
PRGS := $(patsubst %.c,%,$(SRCS))
PRG_SUFFIX=.exe
BINS := $(patsubst %,%$(PRG_SUFFIX),$(PRGS))
## OBJS are automagically compiled by make.
OBJS := $(patsubst %,%.o,$(PRGS))
##
all : $(BINS)
##
## For clarity sake we make use of:
.SECONDEXPANSION:
OBJ = $(patsubst %$(PRG_SUFFIX),%.o,$@)
ifeq ($(PRG_SUFFIX_FLAG),0)
BIN = $(patsubst %$(PRG_SUFFIX),%,$@)
else
BIN = $@
endif
## Compile the executables
%$(PRG_SUFFIX) : $(OBJS)
$(CC) $(OBJ) $(LDFLAGS) -o $(BIN)
##
## $(OBJS) should be automagically removed right after linking.
##
veryclean:
ifeq ($(PRG_SUFFIX_FLAG),0)
$(RM) $(PRGS)
else
$(RM) $(BINS)
endif
##
rebuild: veryclean all
##
## eof Generic_Multi_Main_PWD.makefile
8条答案
按热度按时间31moq8wy1#
像这样做
字符串
你说你不想要高级的东西,但你也可以根据一些默认规则这样缩短它。
型
cgh8pdjw2#
模式规则允许您编译多个c文件,这些文件需要使用
make
的相同编译命令,如下所示:字符串
yacmzcpb3#
字符串
zf2sa74q4#
字符串
6rqinv9w5#
字符串
我更喜欢ansi和pedantic,一个更好的控制你的程序。它不会让你编译,而你仍然有警告!!
bwitn5fc6#
一个简单的程序的编译流程很简单,我可以把它画成一个小图:source -> [compilation] -> object [linking] -> executable。这个图中有 files(source,object,executable),还有 rules(make 的术语)。这个图在 Makefile 中定义。
当你启动make时,它会读取 Makefile,并检查是否有更改的 files。如果有,它会触发依赖于它的 rule。rule 可能会生成/更新更多的 files,这可能会触发其他的 rules 等等。如果你创建了一个好的makefile,只需要必要的 rules(编译器/链接命令)将运行,它代表依赖路径中修改文件的“下一个”。
选择一个例子 Makefile,阅读语法手册(无论如何,它是清晰的第一眼,w/o手册),并画出图。你必须了解编译器选项,以找出结果文件的名称。
make图应该尽可能的复杂。你甚至可以做无限循环(不要做)!你可以告诉 make,哪个规则是你的 * 目标 *,所以只有左边的 * 文件 * 将被用作触发器。
再次:绘制图表!
ezykj2lf7#
字符串
make all
可以:型
如果你设置了
CXX
和CXXFLAGS
变量,make
将使用它们。piv4azn78#
这将把
make
上的所有*.c
文件编译为不带gcc program.c -o program
扩展名的可执行文件。make
会自动添加任何你添加到CFLAGS
的标志,就像CFLAGS = -g Wall
一样。如果你不需要任何标志,
CFLAGS
可以留空(如下所示)或完全省略。字符串