2014-01-22 120 views
0

我无法编写一个可行的makefile。我已阅读下面的教程(*),我看到,我们可以写简单的文件,如:我的makefile有什么问题?

program : program.cpp 
    g++ -o program program.cpp -lm 

(*)http://www.pma.caltech.edu/~physlab/make.html

我试图ADPT的例子,以满足自己的需要,但它不工作:

interpreter: gvr_v51.c gvr_v51_interpreter.h 
    gcc gvr_v51_interpreter.h gvr_v51.c -pedantic -Wall -std=c99 -o gvr_v51 -lSDL 

parser: gvr_v51_parser.h gvr_v51.c 
    gcc gvr_v51_parser.h gvr_v51.c -pedantic -Wall -std=c99 -o gvr_v51 -lSDL 

我需要实现的是能够允许用户通过输入“make interpreter”或“make parser”进行编译。两者的区别在于第一个将包含头文件gvr_v51_interpreter.h,而另一个将包含头文件gvr_v51_parser.h

两个头文件是相同的,除了一个#define行在两个值中保持不同的值文件。头文件的其余内容包括结构声明,枚举声明以及函数原型。

是我想达到的甚至可能吗?如果是这样,你能告诉我我做错了什么吗?

谢谢。

+2

你得到了什么错误? – AndyG

+0

的ubuntu @ Ubuntu的VirtualBox的:〜/文档/ GVR $使解释器 GCC gvr_v51_interpreter.h gvr_v51.c -pedantic -Wall -std = C99 -o gvr_v51 -lSDL 在文件从gvr_v51.c包括:3:0: gvr_v51_file_handling.c:函数'check_args': gvr_v51_file_handling.c:6:18:错误:'ARGC_EXPECTED'未声明(首次在此函数中使用) gvr_v51_file_handling.c:6:18:注意:每个未声明的标识符仅报告一次对于每个函数,它出现在 gvr_v51_file_handling.c:7:3:warning:隐式声明函数'printf'[-Wimplicit-function-declaration] – lcazarre

+2

您可以使用-DInterpreter,然后将#ifdef放在标题中。它是一个更好的方式来做它比有两个相同的文件...但我不知道为什么这不起作用 –

回答

1

您不能通过将头文件附加到要编译的c文件列表来包含头文件。不过,您可以根据宏的定义包含头并使用gcc选项预定义它。

在gvr_v51.c:

#ifdef INTERPRETER 
#include "gvr_v51_interpreter.h" 
#else 
#include "gvr_v51_parser.h" 
#endif 

在Makefile中:

interpreter: 
    gcc -lSDL -DINTERPRETER -o gvr_v51 gvr_v51.c 

parser: 
    gcc -lSDL -o gvr_v51 gvr_v51.c 
+0

工作。谢谢! – lcazarre

1

可以包括头文件条件不改变的源文件(gvr_v51.c):

interpreter: gvr_v51.c gvr_v51_interpreter.h 
    gcc -include gvr_v51_interpreter.h gvr_v51.c -pedantic ... 
parser: gvr_v51_parser.h gvr_v51.c 
    gcc -include gvr_v51_parser.h gvr_v51.c -pedantic ... 

一旦这是工作,有几种方法来改善它。特别是,我敦促你不要有两个建立gvr_v51的规则,他们都不叫gvr_v51