我有一个C程序,里面有这样的代码,我想创建一个Makefile,给一个目标传递de -D标志给GCC,并有相应的MACRO,这样就可以正确的头文件+源文件。
#if defined(MATRIX)
#include "Matrix.h"
#elif defined(QTREE)
#include "QTree.h"
#endif
我想创建一个Makefile,在给定的目标下,用相应的MACRO向GCC传递de -D标志,这样就能编译出正确的头文件和源文件。
目前我有这个Makefile。
# Makefile for compiling the battleship game
C=gcc
STANDARD=c99
HEADER_DIR=includes
ODIR=obj
CFLAGS=$(C) -c -std=$(STANDARD) -I$(HEADER_DIR)
SDIR=src
_OBJS = Battleship.o Game.o Cell.o Ship.o Bitmap.o IO.o Aux.o Matrix.o QTree.o Board.o
OBJS = $(patsubst %,$(ODIR)/%,$(_OBJS))
# Program name
PROG=battleship
$(ODIR)/%.o: $(SDIR)/%.c
$(CFLAGS) -o $@ $<
$(PROG1): $(OBJS)
$(C) -o $(PROG) -D MATRIX $(OBJS)
$(PROG2): $(OBJS)
$(C) -o $(PROG) -D QTREE $(OBJS)
.PHONY: game_with_matrix
game_with_matrix: $(PROG1)
.PHONY: game_with_qtree
game_with_qtree: $(PROG2)
.PHONY: clean
clean:
rm -f $(ODIR)/*.o $(PROG)
但它总是输出: make: Nothing to be done for [target].
我真的不知道哪里出了问题:(
EDIT:
当我调用make时,我使用的是 make game_with_matrix
或 make game_with_qtree
.
先谢谢你
首先,这个。
C=gcc
CFLAGS=$(C) -c -std=$(STANDARD) -I$(HEADER_DIR)
$(ODIR)/%.o: $(SDIR)/%.c
$(CFLAGS) -o $@ $<
"CFLAGS "这个名字不好。我强烈建议这样做。
C=gcc
CFLAGS= -c -std=$(STANDARD) -I$(HEADER_DIR)
$(ODIR)/%.o: $(SDIR)/%.c
$(C) $(CFLAGS) -o $@ $<
现在你可以添加一个 特定目标变量值:
$(PROG1): CFLAGS += -DMATRIX
$(PROG1): $(OBJS)
$(C) -o $(PROG) $(OBJS)
$(PROG2): CFLAGS += -DQTREE
$(PROG2): $(OBJS)
$(C) -o $(PROG) $(OBJS)
但你还没有定义 PRG1
也不 PROG2
我觉得没有必要。把它们去掉,然后这样做。
$(PROG): $(OBJS)
$(C) -o $@ $^
game_with_matrix: CFLAGS += -DMATRIX
game_with_matrix: $(PROG)
game_with_qtree: CFLAGS += -DQTREE
game_with_qtree: $(PROG)
这是你实际使用的makefile吗? 因为你既没有定义变量 PROG1
或变数 PROG2
所以,如果你的makefile看起来像那样,那显然是问题所在。
然而,即使你解决了这个问题,这也是危险的。 你不应该把两种类型的对象放到同一个子目录中。 你必须记住,总是要做一次 make clean
因为make无法知道之前的构建是否使用了 MATRIX
或 QTREE
设置,并且你将尝试链接用不同设置编译的对象文件。
你应该创建两个不同的 OBJ
目录,每个目录一个,并在构建该程序时使用它们。