C 将命令转换为生成文件

C 将命令转换为生成文件,c,gcc,makefile,C,Gcc,Makefile,我一直在阅读Makefiles,但我仍然不知道如何将以下命令写入Makefile gcc -std=c89 A.c -c gcc -std=c89 B.c -c gcc -std=c89 C.c -c gcc -std=c89 A.o B.o -o A gcc -std=c89 C.o B.o -o C A和C依赖于B,但它们是独立的程序 这是我想出来的,但不起作用: CC = gcc -std=c89 FILES = A.c B.c C.c OUT = out build: $(FILES)

我一直在阅读Makefiles,但我仍然不知道如何将以下命令写入Makefile

gcc -std=c89 A.c -c
gcc -std=c89 B.c -c
gcc -std=c89 C.c -c
gcc -std=c89 A.o B.o -o A
gcc -std=c89 C.o B.o -o C
A和C依赖于B,但它们是独立的程序

这是我想出来的,但不起作用:

CC = gcc -std=c89
FILES = A.c B.c C.c
OUT = out
build: $(FILES)
    $(CC) -o $(OUT) $(Files)
clean:
    rm -f *.o core
假设您使用,您可以主要依靠内置规则:

CFLAGS = -std=c89
LDFLAGS = -std=c89
A: A.o B.o
C: C.o B.o
这将执行您列出的命令。然而,它并不关心清洁或类似的事情。不过,您不一定需要这样做-当需要重新编译/重新链接时,
make
程序会注意到并自动执行此操作。

尝试以下操作:

X1 = A
O1 = A.o B.o

X2 = B
O2 = C.o B.o

DBGFLAGS = -g -O0
CFLAGS = -W -Wall $(DBGFLAGS)

all: $(X1) $(X2) 

$(X1): $(O1)
        $(CC) $(LDFLAGS) -o $@ $(O1) $(LIBS)

$(X2): $(O2)
        $(CC) $(LDFLAGS) -o $@ $(O2) $(LIBS)

.PHONY: clean

clean:
        rm -f $(X1) $(O1) $(X2) $(O2) *~

如果复制粘贴不起作用,请将8个空格更改为一个制表符。

这是一个无噱头的生成文件,gcc和rm前面的字符必须是“tab”字符,它们不是空格

all: A C

A.o: A.c
    gcc -std=c89 -c A.c

B.o: B.c
    gcc -std=c89 -c B.c

C.o: C.c
    gcc -std=c89 -c C.c

A: A.o B.o
    gcc -std=c89 -o A A.o B.o

C: C.o B.o
    gcc -std=c89 -o C C.o B.o

clean:
    rm A C a.o b.o c.o core

在编写makefile时,通常从结尾开始,然后按照自己的方式开始编写。您从最终产品开始,并给出如何从起点生产该产品的规则

在本例中,您似乎有两个最终产品:
A
C

all: A C
如果没有在命令行中指定目标,make将生成它在makefile中看到的第一个目标。因此,您希望将其作为文件中的第一个目标,其他目标位于其下方。如果你认为它是一棵树,这是树的根,下面的每一项都是这棵树的一个分支

还可以定义未包含在此根目录下的辅助目标。例如,许多(大多数?)makefile包含一个名为
clean
的目标,该目标删除在构建过程中创建的所有中间文件。这仅在用户调用
make clean
时使用,而不是作为命令发出
make
的一部分

无论如何,然后你告诉它每一个都依赖于什么,以及如何从它所依赖的内容创建它:

A: A.o B.o
    $(CC) -o A A.o B.o

C: B.o C.o
    $(CC) -o B B.o C.o
然后(如果有必要——它不在这里),您可以告诉它每个
.o
文件如何依赖于
.c
文件。Gmake(就像几乎永远的代码>使< /Cord>工具存在),但是有规则告诉它如何编译一个C或C++文件来产生匹配的对象文件。这些将与makefile顶部包含的内容类似:

CC = gcc

.c.o:
    $(CC) $(CFLAGS) -c $*.c
将CFLAGS的当前值作为标志传递给编译器,因此您希望将其设置为所需的标志——在您的示例中:

CFLAGS = -std=c89
您通常希望将其放在makefile的顶部,通常放在任何目标之前


我应该补充一点,这甚至不能涵盖makefile中可以做的所有事情。当你处理大量的文件时,有很多快捷方式非常方便,但是当你只有三个源文件时,这些快捷方式并没有真正的用处。

我得到了这个错误:'ake:Fatal error:not know-make-target'B.oAdd:
%.o:%.c[ENTER][TAB gcc-o$@$(打字,应该是
c:c.o B.o
)@Beta:Oops。非常感谢。固定的。