首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我如何写一个“选择性的”Makefile?

我如何写一个“选择性的”Makefile?
EN

Stack Overflow用户
提问于 2018-10-08 00:55:05
回答 4查看 185关注 0票数 1

新手问题在这里。

我有一个目录,里面有很多.c文件,它们是我自己编码的基本libc函数。

我在这些文件中编写了一些main()来测试函数,并且我想编写一个Makefile,它只允许我编译我想要测试的文件,例如:

代码语言:javascript
复制
make memset.c

并且只获取在memset.c中编写的代码的可执行文件。

我试着这样做:

代码语言:javascript
复制
CC = gcc
CFLAGS = -Wall -Wextra -pedantic

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

但很明显,它不起作用。我不知道用什么来代替“全部”。我知道这很基本,但我没有做到,我做了研究,但没有找到这个特定问题的答案。

提前感谢您的帮助。

EN

回答 4

Stack Overflow用户

发布于 2018-10-08 01:02:39

如果你使用make -n -p,你会得到make中所有内置规则的转储。在GNU Make 4.1中,这包括:

代码语言:javascript
复制
%: %.o
#  recipe to execute (built-in):
        $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

因此,您可能只需要在您当前拥有all的makefile中使用%

您可能还会发现,您不需要那些已经内置的规则。假设您有三个C文件,每个文件都有您指定的main()abs.cdiv.cfmax.c。Makefile的长度不能超过两行:

代码语言:javascript
复制
CFLAGS = -Wall -Wextra -pedantic
all: abs div fmax

这将允许您执行make abs以使abs成为可执行文件,并执行make all以使它们全部可执行。

票数 1
EN

Stack Overflow用户

发布于 2018-10-08 01:33:13

您可以定义static pattern rules来构建目标文件和可执行文件,然后以所需可执行文件的名称作为目标调用make:

代码语言:javascript
复制
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)

然后:

代码语言:javascript
复制
$ make memset.o

只构建memset.o

代码语言:javascript
复制
$ make memset

只构建memset (如果需要,还可以构建memset.o ),

代码语言:javascript
复制
$ make obj

构建所有目标文件,

代码语言:javascript
复制
$ make # or make all

构建所有可执行文件(如果需要,还可以生成目标文件),以及

代码语言:javascript
复制
$ make clean

删除所有可执行文件和目标文件。

票数 1
EN

Stack Overflow用户

发布于 2018-10-08 01:18:11

使用wildcard,您可以实现您想要的功能。

请注意,如果每个程序仅依赖于一个.c文件,则不需要%.o规则:

代码语言:javascript
复制
CC = gcc
CFLAGS = -Wall -Wextra -pedantic

SRC  := $(wildcard *.c)
EXEC = $(SRC:%.c=%)

all: $(EXEC)

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

并以这种方式调用,例如:

代码语言:javascript
复制
make memset
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52690776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档