我有一个源文件test.c
及其标题test.h
,一个文件main.c
和makefile
。
我想设置我的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'
。
答案 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/