noob问题在这里。
我的目录中包含许多.c文件,它们基本上是libc函数,我将自己编码为练习。
我在这些文件中写了一个main()来测试功能,并且我想编写一个Makefile,该文件允许我仅编译我想测试的文件,例如:
make memset.c
仅获取在memset.c中编写的代码的可执行文件。
我试图做这样的事情:
CC = gcc
CFLAGS = -Wall -Wextra -pedantic
all : %.o
$(CC) $(CFLAGS) $<
%.o : %.c
$(CC) $(CFLAGS) $< -c -o $@
但是显然它不起作用。我没有什么可以代替“全部”。 我知道这是非常基础的,但是我没有做到,我做了研究,但没有找到这个特定问题的答案。
预先感谢您的帮助。
答案 0 :(得分:1)
如果您执行make -n -p
,则会得到make中所有内置规则的转储。在GNU Make 4.1中,这包括:
%: %.o
# recipe to execute (built-in):
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
因此,您可能仅需要在您的makefile中当前拥有%
的地方all
。
您还可能会发现不需要内置的那些规则。假设您有三个C文件,每个文件都有您指定的main()
:abs.c
,{{1} }和div.c
。您的Makefile不得超过两行:
fmax.c
这将允许您执行CFLAGS = -Wall -Wextra -pedantic
all: abs div fmax
来使make abs
可执行,而执行abs
来使它们全部可用。
答案 1 :(得分:1)
您可以定义static pattern rules来构建目标文件和可执行文件,然后以所需的可执行文件名称作为目标调用make:
CC = gcc
CFLAGS = -Wall -Wextra -pedantic
SRC := $(wildcard *.c)
OBJ := $(patsubst %.c,%.o,$(SRC))
EXE := $(patsubst %.c,%,$(SRC))
.PHONY: all obj
all: $(EXE)
obj: $(OBJ)
$(EXE): %: %.o
$(CC) $(LDFLAGS) $< -o $@
$(OBJ): %.o: %.c
$(CC) $(CFLAGS) $< -c -o $@
.PHONY: clean
clean:
rm -f $(OBJ) $(EXE)
然后:
$ make memset.o
仅构建memset.o
,
$ make memset
仅构建memset
(如果需要,则构建memset.o
)
$ make obj
构建所有目标文件,
$ make # or make all
构建所有可执行文件(和目标文件,如果需要),并且
$ make clean
删除所有可执行文件和目标文件。
答案 2 :(得分:0)
使用wildcard
,您可以实现自己想要的。
请注意,如果每个程序仅依赖一个.c
文件,则不需要%.o
规则:
CC = gcc
CFLAGS = -Wall -Wextra -pedantic
SRC := $(wildcard *.c)
EXEC = $(SRC:%.c=%)
all: $(EXEC)
%: %.c
$(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
只需调用这种方式即可:
make memset
答案 3 :(得分:0)
您已经有足够的选择性地编译可执行文件:
CC = gcc
CFLAGS = -Wall -Wextra -pedantic
%.o : %.c
$(CC) $(CFLAGS) $< -c -o $@
% : %.o
$(CC) $(LDLAGS) $< -o $@
然后,您只需要使用所需的目标(可执行文件)调用make:
make select
如果您有几套带有不同标志的可执行文件,则可以使用:
EX0 = drink clean
${EXE0}: % : %.o
$(CC) $(LDLAGS) -lwater $< -o $@
EX1 = burn melt
{EX1}: % : %.o
$(CC) $(LDLAGS) -lfire $< -o $@