如何用-S和-c编写makefile来编译?

时间:2012-11-11 18:27:32

标签: c gcc makefile

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

我已经尝试设置makefile,因为我认为这是正确的,但这当然不会运行最后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'

1 个答案:

答案 0 :(得分:2)

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

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

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

重要的是要知道规则test.s和文件test.s

之间存在差异

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

这是一个可以做你想做的Makefile的例子。我把dep放在所有,所以你可以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/