人。我正在学习GNU-Make,我有以下项目结构:
~/projects
/sysCalls
ex1.c
ex2.c
ex3.c
ex4.c
ex5.c
ex6.c
ex7.c
每个.c
源都非常简单,有自己的main
函数,必须构建到相应的二进制文件中(最好以其源代码命名)。但我想构建一个bin
目录(添加到我的.gitignore
文件中)。
我当前的Makefile是:
CC := gcc
CFLAGS := -Wall -g
SRC := $(wildcard *.c)
TARGET := $(SRC:.c=)
all: bin $(TARGET)
mv $(TARGET) bin/
bin:
mkdir bin
clean:
rm -fr bin/
它按预期工作,但始终构建每个源。而且我不喜欢手动将所有内容移至bin
。
有关如何改进此Makefile的任何提示或想法?
答案 0 :(得分:1)
将TARGET
行替换为
TARGET := $(addprefix bin/,$(SRC:.c=))
并添加(使用适当的编译/链接规则)
bin/%: %.c
make
仍然会构建任何不是最新的二进制文件,而make bin/ex1
将直接在bin
目录中构建该单个二进制文件。
面对all
参数,-j
目标上的操作顺序并不健全。
对于GNU make,这是order-only prerequisites
的用途。
答案 1 :(得分:1)
感谢Etan Reisner的回答,我发现了我认为它的解决方案。
CC := gcc
CFLAGS := -Wall -g
SRC := $(wildcard *.c)
TARGET := $(SRC:%.c=bin/%)
all: | bin $(TARGET)
bin/% : %.c
$(CC) $(CFLAGS) $< -o $@
bin:
mkdir bin
clean:
rm -fr bin/
关键是使用bin/% : %.c
规则。