我想为同一个库编写很多小的示例程序,每个程序都需要gcc $(OtherOpt) -o xxx -lthelibname xxx.c
。
如何编写没有几十个tagret行的Makefile?
答案 0 :(得分:3)
模式规则是这些情况的朋友。只要您的目标都符合可预测的模式 - 并且在这种情况下它们就是这样,因为它们都是来自foo
的“创建foo.c
” - 您可以编写单个模式规则将用于所有目标:
OtherOpt=-Wall -g
all: $(patsubst %.c,%,$(wildcard *.c))
%: %.c
gcc $(OtherOpt) -o $@ -lthelibname $<
现在,您可以只运行make
来构建所有应用,或make appname
来构建特定应用。在这里,我创建了一个模式规则,可以在something
创建something.c
的任何时候使用。我使用了$@
自动变量,它将扩展为输出的名称,以及$<
变量,它将扩展为第一个先决条件的名称,这样命令行是正确的,无论如何正在构建的特定应用程序。从技术上讲,你不需要all
行,但我想你可能不想总是必须输入你想要构建的应用程序的名称。< / p>
另外,从技术上讲,你可以在没有任何这个makefile的情况下离开,因为GNU make已经有了%: %.c
关系的内置模式规则!我提到这个选项只是为了完整;就个人而言,我更喜欢按照我在这里展示的方式做事,因为它更明确地发生了什么。
答案 1 :(得分:1)
%.o: %.c
gcc $(OtherOpt) -c -o $@ -lthelibname $<
将所有.c文件编译为相同基本名称的.o文件(目标代码)。然后在您的实际目标中,您将包含所有必需的.o文件作为依赖项并使用gcc $(OtherOpt) -o $@ $^ -lthelibname
,假设我没有误解您的构建是如何设置的。
某些版本的make还支持后缀规则.c.o
与%.o: %.c
几乎相同,但后缀规则不能具有任何依赖关系。编写.c.o: foo.h
告诉make将“foo.h”编译为“foo.co”而不是要求“foo.h”作为任何具有。%.o: %.c foo.h
后缀的文件的依赖关系。
答案 2 :(得分:1)
我从http://sourceforge.net/projects/gcmakefile/
学习LDLIB = -lpthread
LDFLAGS = -Wl,-O1 -Wl,--sort-common -Wl,--enable-new-dtags -Wl,--hash-style=both $(LDLIB)
SRCDIRS =
SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp
CFLAGS = -pipe -march=core2 -mtune=generic -Wfloat-equal \
#-Wall -pedantic
ifeq ($(SRCDIRS),)
SRCDIRS = .
endif
SOURCES = $(foreach d,$(SRCDIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
TARGET = $(addprefix bin/,$(basename $(SOURCES)))
all: $(TARGET)
ls -l $(TARGET)
bin/%: %.c dir
gcc $(CFLAGS) $(LDFLAGS) -o $@ $<
dir:
@-mkdir bin
.PHONY : clean
clean:
-rm $(TARGET)
-rmdir bin