如何为一个模块化的c项目制作一个模块化的Makefile?

问题描述 投票:0回答:1

我有一个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_matrixmake game_with_qtree.

先谢谢你

c makefile header-files modularity
1个回答
1
投票

首先,这个。

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)

0
投票

这是你实际使用的makefile吗? 因为你既没有定义变量 PROG1 或变数 PROG2所以,如果你的makefile看起来像那样,那显然是问题所在。

然而,即使你解决了这个问题,这也是危险的。 你不应该把两种类型的对象放到同一个子目录中。 你必须记住,总是要做一次 make clean 因为make无法知道之前的构建是否使用了 MATRIXQTREE 设置,并且你将尝试链接用不同设置编译的对象文件。

你应该创建两个不同的 OBJ 目录,每个目录一个,并在构建该程序时使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.