2012-01-29 73 views
0

后续:Set up a development environment on Linux targeting Linux and Windowsmake:模式规则不适用?

项目目录看起来是这样的:

/pps 
    /src 
    /obj 
    /bin 
    Makefile 

和Makefile的内容是这样的:

OBJ_DIR = obj 
SRC_DIR = src 
BIN_DIR = bin 

INCLUDE = -I./$(SRC_DIR) 
LIBS = 

_SRCS = print_current_dir.c test_main.c 

_OBJS = print_current_dir.o test_main.o 

SRCS = $(addprefix $(SRC_DIR)/,$(_SRCS)) 
OBJS = $(addprefix $(OBJ_DIR)/,$(_OBJS)) 

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

all: $(BIN_DIR)/pps-linux $(BIN_DIR)/pps-win32 

$(BIN_DIR)/pps-linux: $(OBJS) 
    CC = cc 
    CFLAGS = -g -Wall $(INCLUDE) $(LIBS) 

$(BIN_DIR)/pps-win32: $(OBJS) 
    CC = i586-mingw32msvc-cc 
    CFLAGS = -g -Wall $(INCLUDE) $(LIBS) 

.PHONY: clean 

clean: 
    rm -f $(OBJS) $(SRC_DIR)/~ core $(BIN_DIR)/* 

的文件print_current_dir.c和test_main.c是只是为了测试。

这个Makefile不起作用:

$ make 
make: *** No rule to make target `obj/print_current_dir.o', needed by `bin/pps-linux'. Stop. 

我认为这个问题是与%的.o规则。我相信这是微不足道的,但我对制作不是很有经验。

谢谢。

+1

注意,如果你没有指定一个目标类型'make',文件中的第一个默认情况下使用。所以你可能不希望'$(OBJ_DIR)/%。o'作为你的第一个目标。 – 2012-01-29 21:38:44

回答

3

这条规则:

$(OBJ_DIR)/%.o: %.c %.h 

指定obj/foo.o取决于foo.c,不src/foo.c。没有foo.c,所以这个规则不能应用(因此是错误信息)。

这应该做的工作:

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(SRC_DIR)/%.h