如何为很多单个c文件程序编写一个更简单的makefile?

时间:2011-07-16 15:02:09

标签: makefile

我想为同一个库编写很多小的示例程序,每个程序都需要gcc $(OtherOpt) -o xxx -lthelibname xxx.c

如何编写没有几十个tagret行的Makefile?

3 个答案:

答案 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