新手问题在这里。
我有一个目录,里面有很多.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 $@
但很明显,它不起作用。我不知道用什么来代替“全部”。我知道这很基本,但我没有做到,我做了研究,但没有找到这个特定问题的答案。
提前感谢您的帮助。
发布于 2018-10-08 01:02:39
如果你使用make -n -p
,你会得到make中所有内置规则的转储。在GNU Make 4.1中,这包括:
%: %.o
# recipe to execute (built-in):
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
因此,您可能只需要在您当前拥有all
的makefile中使用%
。
您可能还会发现,您不需要那些已经内置的规则。假设您有三个C文件,每个文件都有您指定的main()
:abs.c
、div.c
和fmax.c
。Makefile的长度不能超过两行:
CFLAGS = -Wall -Wextra -pedantic
all: abs div fmax
这将允许您执行make abs
以使abs
成为可执行文件,并执行make all
以使它们全部可执行。
发布于 2018-10-08 01:33:13
您可以定义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
删除所有可执行文件和目标文件。
发布于 2018-10-08 01:18:11
使用wildcard
,您可以实现您想要的功能。
请注意,如果每个程序仅依赖于一个.c
文件,则不需要%.o
规则:
CC = gcc
CFLAGS = -Wall -Wextra -pedantic
SRC := $(wildcard *.c)
EXEC = $(SRC:%.c=%)
all: $(EXEC)
%: %.c
$(CC) $(CFLAGS) $< -o $@ $(LDFLAGS)
并以这种方式调用,例如:
make memset
https://stackoverflow.com/questions/52690776
复制相似问题