我的问题是:我想创建一个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)
任何帮助将不胜感激。
答案 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);