2012-11-11 61 views
3

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

我试图设置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'

+3

如何'所有:优化test.s' ? –

回答

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 

最后,因为你似乎有点不稳如何Makefile中工作,(我不怪你诚实),我建议您阅读本教程:http://mrbook.org/tutorials/make/

+0

正如在(现在更新的)问题中提到的,您的第一个建议引发了多个定义的进一步错误 – franka

+0

对于两条线都不是,只是对依赖关系线。从第二个移除,而不是第一个。 – OmnipotentEntity

+0

我更新了包含示例Makefile的答案,让我知道它是否有效。 – OmnipotentEntity