3

我有一个源文件test.c和它的头test.h文件,一个文件main.cmakefile. 我想设置我的makefile,以便它(1)编译test.c以构建可执行文件test.o,并且(2)编译test.c以打印汇编代码以test.s使用-S标志。

我尝试按照我认为正确的方式设置生成文件,但这当然不会实际运行最后test.s一行。

FLAGS = -c -Wall
CC = gcc
ASM = -S

all : optimize
optimize: main.o test.o
    $(CC) main.o test.o -o optimize
main.o: main.c test.h
    $(CC) $(FLAGS) main.c
test.o: test.h test.c
    $(CC) $(FLAGS) test.c
test.s: test.h test.c
    $(CC) $(ASM) -Wall test.c

谁能告诉我我应该如何以不同的方式构建它来创建test.s和 test.o?

我尝试将optimize:行和以下行更改为:

optimize: main.o test.o test.s
    $(CC) main.o test.o test.s -o optimize

但链接器给出了错误multiple definition of 'test'

4

1 回答 1

2

只需将 test.s 添加到以 . 开头的行optimize:

这样做是将规则添加test.s到优化行的依赖项中。

您也可以按照 Vaughn Cato 的建议将其添加到 all 行。

重要的是要知道规则 test.s 和文件 test.s 之间存在差异

您可以将任何您想要的名称作为规则的名称,但按照惯例,您通常只使用文件名。

这是一个示例 Makefile ,它将执行您想要的操作。我把 dep 放在 all 下,这样你就可以了make asm,为了清楚起见,我还将规则名称更改为 asm。

FLAGS = -c -Wall
CC = gcc
ASM = -S

all : optimize asm
optimize: main.o test.o
    $(CC) main.o test.o -o optimize
main.o: main.c test.h
    $(CC) $(FLAGS) main.c
test.o: test.h test.c
    $(CC) $(FLAGS) test.c
asm: test.h test.c
    $(CC) $(ASM) -Wall test.c -o test.s

最后,因为您似乎对 Makefiles 的工作方式有点不放心,(老实说,我不怪您),我建议阅读本教程: http: //mrbook.org/tutorials/make/

于 2012-11-11T18:28:53.210 回答