C 我的makefile有什么问题?

C 我的makefile有什么问题?,c,makefile,C,Makefile,我无法编写有效的makefile。我已经阅读了以下教程(*),我发现我们可以编写简单的文件,例如: program : program.cpp g++ -o program program.cpp -lm (*) 我试图采用这个例子来满足我自己的需要,但它不起作用: interpreter: gvr_v51.c gvr_v51_interpreter.h gcc gvr_v51_interpreter.h gvr_v51.c -pedantic -Wall -std=c99 -o

我无法编写有效的makefile。我已经阅读了以下教程(*),我发现我们可以编写简单的文件,例如:

program : program.cpp
    g++ -o program program.cpp -lm
(*)

我试图采用这个例子来满足我自己的需要,但它不起作用:

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
我需要实现的是能够允许用户通过键入“makeinterpreter”或“makeparser”进行编译。两者之间的区别在于,第一个将包括头gvr_v51_解释器.h,而另一个将包括头gvr_v51_parser.h

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

我想达到的目标可能实现吗?如果是这样,你能告诉我我做错了什么吗


谢谢。

您不能通过将头文件附加到要编译的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

您可以有条件地包括头文件而不更改源文件(
gvr_v51.c
):


一旦成功,有几种方法可以改进它。特别是,我敦促您不要有两条规则构建
gvr\u v51
,它们都不叫
gvr\u v51

您会遇到什么错误?ubuntu@ubuntu-VirtualBox:~/Documents/GvR$make解释器gcc GvR_v51_解释器.h GvR_v51.c-pedantic-Wall-std=c99-o GvR_v51-lSDL包含在GvR_v51文件中。c:3:0:GvR_v51_文件处理。c:In函数“check_args”:GvR_v51_文件处理。c:6:18:错误:“ARGC_EXPECTED”未声明(首次在此函数中使用)gvr_v51_文件处理。c:6:18:注意:对于出现在gvr_v51_文件处理中的每个函数,每个未声明的标识符只报告一次。c:7:3:警告:函数“printf”的隐式声明[-Wimplicit函数声明]您可以使用-DInterpreter,然后将#ifdef放入标题中。这是一种比拥有两个完全相同的文件更好的方法。。。但我不知道为什么这不起作用这是我犯的错误的一个例子。总之,每次我输入make解释器时,我都有25k行错误和Ubuntu崩溃…gvr_v51.c是否有
\include
指令?它需要哪个标题?
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 ...