如何制作大量类似的可执行文件

时间:2014-03-20 14:18:45

标签: c++ c makefile gnu

我有一个带有makefile的测试目录,如:

    EXECS = pgm1 pgm2 pgm3 pgm4 pgm5 ...

    OBJS = $(addsuffix .o, $(EXECS))

    all: $(EXECS)

    %.o : %.c
        $(CC) -c $< -o $@ $(IFLAGS)

    $(EXECS) : $(OBJS)
        $(CC) $@.o -o $@ $(LFLAGS)

    pgm1 : pgm1.o
        $(CC) $< -o $@ $(LFLAGS)

    % : %.o
        $(CC) $< -o $@ $(LFLAGS)

pgm1 : pgm1.o链接规则有效,但我不想为每个程序输入一个。

% : %.o规则不起作用(它选择没有链接标记的默认规则)

$(EXECS) : $(OBJS)规则有效,但每次.o文件更改时,全部都会链接可执行文件。这并不重要,因为程序很小,但修复会很好。

有什么建议吗?

...后来

感谢大家的建议。解决方案是所有这些解决方案的简单组合:

% : %.c
    $(CC) $(IFLAGS) $< -o $@ $(LFLAGS)

2 个答案:

答案 0 :(得分:0)

%:%。o规则应该有效,但我猜make是使用优先级较高的默认规则

%:%.c
    $(CC) $@.o -o $@

直接从C编译和链接,没有你的变量。

您可以重新定义此默认规则以符合您的需要,或通过编写

删除它
%:%.c

没有命令,请参阅http://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html#SEC104

答案 1 :(得分:0)

模式规则不起作用,因为您已在$(EXECS) : $(OBJS)行中为目标定义了明确的规则。显式规则优先于隐式规则,如模式规则。删除显式规则,它将按您的意愿工作:

EXECS = pgm1 pgm2 pgm3 pgm4 pgm5 ...

all: $(EXECS)

%.o : %.c
    $(CC) -c $< -o $@ $(IFLAGS)

% : %.o
    $(CC) $< -o $@ $(LFLAGS)