2016-11-08 87 views
0

我一直在Makefiles遇到严重的麻烦,我试图在其中运行这些命令,并且迄今为止,我所做的大部分更改都导致“无法为所有'执行任何操作”“,无论如何我改变了线条,它不起作用。例如,PROG4应该在下面工作,但它说什么都没有做。使用makefile进行多次编译

BIN_DIR = bin 
LEX_DIR = lexyacc-code 
LIB_DIR = lib 
SRC_DIR = src 
OBJ_DIR = obj 

CC = gcc 
BS = bison 
FX = flex 
CFLAGS = -I$(LIB_DIR) 

SRCS = $(wildcard $(LEX_DIR)/calc3b.c) 
SRCS2 = $(wildcard $(LEX_DIR)/calc3.y) 
SRCS3 = $(wildcard $(LEX_DIR)/calc3.l) 
SRCS4 = $(wildcard $(OBJ_DIR)/y.tab.c) 
SRCS5 = $(wildcard $(OBJ_DIR)/lex.yy.c) 

OBJS = $(patsubst $(LEX_DIR)/%.c,$(OBJ_DIR)/%.o,$(SRCS)) 


PROG = calc3b 
PROG2 = y.tab 
RM = rm -f 

MVV="$(shell mv y.tab.c obj)"; echo $MVV 


all: $(PROG2) $(PROG4) 


$(PROG): $(OBJS) 
    $(CC) $^ -o $(PROG) 

$(PROG2): 
    $(BS) -y -d $(SRCS2) 

$(PROG4): $(CC) -c $(SRCS4) $(SRCS5) $(CFLAGS) 


$(OBJ_DIR)/%.o: $(LEX_DIR)/%.c 
    $(CC) $(CFLAGS) -c $< -o [email protected] 


clean: 
    $(RM) $(PROG) $(OBJS) 

只有PROG2工作,基本上是结果,我有头文件和源文件,我想移动特定的文件夹,但最终我以“MV”的命令做了(我知道反对的Makefile它)。

的命令是这些:

bison -y -d calc3.y 
flex calc3.l 
gcc -c y.tab.c lex.yy.c 
gcc y.tab.o lex.yy.o calc3b.c -o calc3b.exe 

第一命令,我有一个报头和源作为一个结果。

第二我有一个来源作为结果。

第三我有2个对象文件作为结果。

第四,我将有一个可执行文件。

因此,我还需要将这些文件移动到其特定的文件夹。

任何人都可以帮我解决这个问题吗?谢谢。

回答

1

我认为与$(PROG4)的问题是,你忘记把命令放在与标签的新行。在上面显示的内容中,整个命令行被放置在应该依赖但不是命令的位置。因此,makefile不执行$(PROG4)的命令。

+1

此外,您还需要声明'PROG2'和'PROG4'的一些先决条件;例如'$(PROG2)'应该列出'$(SRCS2)'作为先决条件,'$(PROG4)'应该列出'$(SRCS4)$(SRCS5)'作为先决条件。真的,这里有很多可以改进的地方。 – MadScientist

+0

声明他们解决了这个问题,谢谢。但是在指定文件夹中创建构件仍然没有实现,因为我只知道如何在对象中完成构件。对于使用'mv'命令的时间。 – Atik