我试图为我的大学项目创建我自己的,小但通用的Makefile。我设法写的是流动的代码。问题是,我必须多次运行make all
来编译所有可执行文件。 .o
个文件和相应的可执行文件是在每次make
调用时逐步创建的,而不是一次创建的。该怎么做呢?
# Variables
Project = Project_Name
Src = src
Include = inc
Lib = lib
Build = build
Dist = dist
Res = resources
LibSem = -L$(Lib) -lbib
CC = gcc $(CFLAGS)
# Vpaths for implicite rules.
vpath %.c $(Src)
vpath %.h $(Include)
vpath %.o $(Build)
vpath %.d $(Build)
# Src is set for explicite named files.
CPPFLAGS += -I$(Src) -I$(Include)
# Define Source variable with the list of .c files
# File is updated by Vim by the call of "make update"
include build/Sources.inc
all: prog1 prog2
cp -fr $(Res)/* $(Dist)
bib: libbib.o
ar -cvrs $(Lib)/libbib.a $^
prog1: prog1.o sem
$(CC) $(CFLAGS) $(CPPFLAGS) -o $(Dist)/$@ $< $(LibSem)
prog2: prog2.o sem
$(CC) $(CFLAGS) $(CPPFLAGS) -o $(Dist)/$@ $< $(LibSem)
update:
#----------------------------------------
# Updating list of sources.
#----------------------------------------
echo -n "Sources = " > $(Build)/Sources.inc
find src/ -type f -name '*.c' -printf "%f " >> $(Build)/Sources.inc
clean:
#----------------------------------------
# Cleaning files.
#----------------------------------------
rm -rf $(Build)/*
rm -rf $(Dist)/*
rm -rf $(Lib)/*
touch $(Build)/Sources.inc
dist: clean dep all
#----------------------------------------
# Distribute archive.
#----------------------------------------
tar -cvzf $(Project).tar.gz $(Include) $(Res) $(Src) Makefile
# changed for output in Build directory
%.o: %.c
$(COMPILE.c) -o $(Build)/$@ $<
# autogenerated dependencies files
-include $(subst .c,.d,$(Sources))
dep %.d: %.c
#----------------------------------------
# Generating auto-dependencies
#----------------------------------------
$(CC) -M $(CPPFLAGS) $< > $(Build)/$@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $(Build)/$@.$$$$ > $(Build)/$@; \
rm -f $(Build)/$@.$$$$
答案 0 :(得分:0)
这些规则是错误的:
prog1: prog1.o sem
$(CC) $(CFLAGS) $(CPPFLAGS) -o $(Dist)/$@ $< $(LibSem)
每个&#34;正常&#34; make 中的规则必须更新您告知的目标,使其更新。在这里,您的规则告诉它将更新文件prog1
,但您的规则实际上做的是更新文件dist/prog1
。这些是完全不同的,你的makefile不起作用,因为你已经撒谎。
一般情况下,无法使用vpath
来描述生成目标的放置位置。 vpath
功能仅在用于查找源文件时有效。
您必须按照以下方式编写规则:
$(Dist)/prog1: $(Build)/prog1.o sem
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $< $(LibSem)
然而,这只是冰山一角。因此,您需要进行更多更改,以便按照您想要的方式进行更改。