Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用相似的名称构建多个目标?_C_Unix_Makefile_Gnu Make_Gnu - Fatal编程技术网

C 如何使用相似的名称构建多个目标?

C 如何使用相似的名称构建多个目标?,c,unix,makefile,gnu-make,gnu,C,Unix,Makefile,Gnu Make,Gnu,所以我的问题和下面的问题完全一样,但是没有人回答 我试图构建一系列小测试文件,每个文件都有一个“test*.c”模式来测试我的库 我想编写一个makefile,一次为每个测试文件(每个文件名:test1、test2、test3..等等)构建可执行文件。然而,我不知道如何做到这一点。 到目前为止,我掌握的情况如下: SRC := $(shell find *.c) ALL_PROG := $(patsubst %.c, %, *.c) .PHONY: all all: $(ALL_PROG)

所以我的问题和下面的问题完全一样,但是没有人回答

我试图构建一系列小测试文件,每个文件都有一个“test*.c”模式来测试我的库

我想编写一个makefile,一次为每个测试文件(每个文件名:test1、test2、test3..等等)构建可执行文件。然而,我不知道如何做到这一点。 到目前为止,我掌握的情况如下:

SRC := $(shell find *.c)
ALL_PROG := $(patsubst %.c, %, *.c)
.PHONY: all

all: $(ALL_PROG)

$(ALL_PROG): $(SRC)
    -gcc $< -o $@
SRC:=$(shell find*.c)
所有程序:=$(patsubst%.c、%、*.c)
冒牌货:全部
全部:$(全部进度)
$(全部进度):$(SRC)
-gcc$<-o$@
这是一个错误的尝试,因为目标将所有.c文件作为依赖项,这导致了循环依赖项

使用shell脚本可以很容易地完成这项工作,但我想知道是否有办法完成同样的工作

提前感谢。

使用
$(所有进度):%:%.c
而不是
$(所有进度):$(SRC)


下面是一个可能与GNU
make
一起使用的Makefile示例:

CC      := gcc
CFLAGS  := -Wall -O2
LDFLAGS := -lm
PROGS   := $(patsubst %.c, %, $(wildcard *.c))

.PHONY: all clean test $(patsubst %, test@%, $(PROGS))

all: $(PROGS)

clean:
    rm -f $(PROGS)

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

$(patsubst %, test@%, $(PROGS)): test@%: %
    ./$^

test: $(patsubst %, test@%, $(PROGS))
和往常一样,注意缩进应该使用制表符而不是空格;stackoverflow.com上使用的编辑器会自动将它们转换为空格

PROGS
变量将包含目录中所有
*.c
文件的名称

.PHONY:
指令告诉Make哪些目标不引用实际文件。
$(patsubst%,test@%,$(PROGS))
扩展到可执行名称列表,每个名称前面都有
test@
:如果目录包含文件
foo.c
bar.c
,则扩展到
test@foo test@bar

$(PROGS):%:%.c
配方将每个.c文件编译为相应的二进制文件

$(patsubst%,test@%,$(PROGS)):test@%:%
配方为每个二进制文件创建一个测试目标。如果我们有文件
foo.c
bar.c
,则此规则扩展为
test@foo test@bar:test@%:%
。这意味着对于
test@foo
test@bar
targets,相应的
test@%
目标需要
%
二进制文件。
/$^
依次扩展为
/%
,从而扩展为二进制名称。(如果不希望Make显示正在运行的命令,请使用
@./$^
。如果不关心测试是否失败,请使用
-./$^

测试
配方扩展为
test@foo
test@bar
如果我们有
foo.c
bar.c
;i、 e.所有可能的测试目标

您可以运行
make clean test
来重新编译目录中的所有.c文件,并执行它们


如果您只担心某个特定的测试程序,比如说
foo.c
,您可以运行
maketest@foo
,如果
foo.c
foo
新,它将重新编译程序。您可以这样做。我正在更新一个构建多个目标的简单make文件。您可以根据需要对其进行修改

TEST1       = test1.exe
TEST2       = test2.exe

### Executable Program Files ###

all : $(TEST1) $(TEST2)

$(TEST1) : test1.c
    gcc -o $(TEST1) test1.c 

$(TEST2) : test2.c
    gcc -o $(TEST2) test2.c 

谢谢,这将适用于少量测试;然而,我想做的是构建一系列测试,比如说20个或更多。这就是为什么,我想知道是否有一个模式规则,我可以编写它来构建更多的测试,而不必编写单独的规则。我只想澄清一下,“$(patsubst%,test@%,$(PROGS)):test@%:%”意味着对于模式生成的每个目标,每个目标(test@%)都需要(%)。因此,第二个冒号表示依赖关系,但是第一个冒号的正式含义是什么(命名?),您可以告诉我有什么来源吗?这是我第一次看到两个冒号。非常感谢。@J.S.M:这是
targets:target pattern:prerequisite pattern
,如中所述。每当我编写Makefiles时,我都会打开一个浏览器窗口,以供用户使用。非常感谢您的输入