编译目录子目录中的多个程序,并使用makefile

时间:2016-09-21 13:30:54

标签: makefile compilation gnu-make

我的问题是:我想创建一个makefile,它将在几个目录中编译程序,但会将可执行文件放在每个目录中名为 executables 的子目录中。我有大量的程序需要编译,因此为每个程序编写规则似乎很乏味。假设我当前的工作目录是 Curr_dir 以下是目录结构 -

Curr_dir
    |
    |__dir1
    |   |__q1.c
    |   |__q2.c
    |   |__q3.c
    |   |__+executable
    |
    |__dir2
    |   |__q4.c
    |   |__q5.c
    |   |__q6.c
    |   |__+executable
    |
    |__Makefile

我在根目录中只列出了2个目录,但有几个目录包含3-4个.c文件。现在我想在我的根目录中使用Makefile编译所有这些.c文件,并将可执行文件放在相应的可执行文件目录中。 这是我的makefile,它编译每个程序并在同一目录中生成可执行文件。

CC= gcc
RM= rm -vrf
CFLAGS= -lm -g
SRCFILES =$(wildcard */*.c)
SRCDIRS= $(wildcard */)
EXECDIRS= $(SRCDIRS:%=%executables)
EXECFILES = $(SRCFILES:%.c=%)
dirs: 
    mkdir -p $(EXECDIRS)

all: dirs $(EXECFILES)

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

.PHONY: clean
clean:
     $(RM) $(EXECFILES) $(EXECDIRS)

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您有两个问题:构建要构建的文件列表,编写规则或规则集来构建它们。碰巧,由于缺乏良好的通配符处理,这两个问题都变得困难。

第一部分:

dir1/q1.c

原油,但有效。

第二部分需要将目标名称(.SECONDEXPANSION: $(EXECFILES): $$(addsuffix .c,$$(subst executables/,,$$@)) @echo building $@ from $< -$(CC) -o $@ $< $(CFLAGS) 与相应的源名称(.SECONDEXPANSION: $(EXECFILES): $$(addsuffix .c,$$(subst executables/,,$$@)) $$(dir $$@) @echo building $@ from $< -$(CC) -o $@ $< $(CFLAGS) %/executables: mkdir -p $@ )相关联。也许最不可怕的方法是使用SECONDEXPANSION来操作目标的模式规则名:

delete from tblCustomerInqry
    where not exists (select 1
                      from tblCustomer c
                      where c.CustomerID = tblCustomerInqry.CustomerID
                     );

delete from tblSpecificConsideration
    where not exists (select 1
                      from tblCustomerInqry ci
                      where ci.CustInqryID = tblSpecificConsideration.CustInqryID
                     );

关于构建目录的最佳方法存在一些争议,但我喜欢这种方法:

void function(classA c);

classA a;
function(a);