2009-04-30 63 views
1

支持你必须通过一些文件包含一个C程序,有的一个被一些人组成,所以如下:帮我创建一个Makefile

---------------------------------------- 
File   | Included files   
---------------------------------------- 
main.c   | stdio.h, table.h 
---------------------------------------- 
list.c   | list.h 
---------------------------------------- 
symbol.c  | symbol.h 
---------------------------------------- 
table.c   | table.h 
---------------------------------------- 
table.h   | symbol.h, list.h 
---------------------------------------- 

请帮我创建一个makefile,谢谢非常! 这是我的Makefile,但有问题吗?谁可以调试这些问题,谢谢!

hello: main.o table.o 
    gcc main.o table.o -o hello 

main.o: main.c table.h 
    gcc -c main.c 

table.o: table.c table.h 
    gcc -c table.c 

symbol.o: symbol.c symbol.h 
    gcc -c symbol.c 

list.o: list.c list.h 
    gcc -c list.c 


clean: 
    rm hello *.o 
+0

虽然pax给了你一个好的开始,他的例子仍然建立在假设(即'main'可执行文件从所有来源调用函数)上。可能是因为依赖性比这个更复杂,所以他的例子可能是完全错误的。 – KevinDTimm 2009-04-30 03:45:27

+0

如果我们知道哪些是你正在使用的(即GNU,BSD等),可能会有一些简化。 此外,list.o应该链接到某个地方? – ctuffli 2009-04-30 15:48:34

回答

6

这里是一个开始,不完全是一个专业会怎么做,但良好的初学者水平:

hello: main.o list.o symbol.o table.o 
    gcc -o hello main.o list.o symbol.o table.o 

main.o: main.c table.h symbol.h list.h 
    gcc -c -o main.o main.c 

list.o: list.c list.h 
    gcc -c -o list.o list.c 

symbol.o: symbol.c symbol.h 
    gcc -c -o symbol.o symbol.c 

table.o: table.c table.h symbol.h list.h 
    gcc -c -o table.o table.c 

clean: 
    rm hello *.o 

与给定生成文件的具体问题是,你没有连接在所有目标文件。由于main.c包括table.htable.h包括symbol.hlist.h,因此您的程序几乎肯定需要链接symbol.olist.o以及。

这也是很好的做法,遵循头部依赖(例如,main.o取决于table.hsymbol.h/list.h因为table.h取决于这两个) - 这是因为没有“纯”的方式来获得头依赖的中间文件。

而且很少将标准头文件放入make文件中,仅仅是因为它们预计不会改变 - 如果它们(新编译器),只需清理并重新制作。